[SCM] Samba Shared Repository - branch master updated
Ralph Böhme
slow at samba.org
Mon May 4 15:34:03 UTC 2020
The branch, master has been updated
via 29cbfd0ba39 s3: smbd: Add a dirfsp parameter to smbd_calculate_maximum_allowed_access().
via 976a60304a7 s3: smbd: Reformat users of smbd_calculate_maximum_allowed_access().
via a20d06675f0 s3: smbd: Add a dirfsp parameter to smbd_calculate_access_mask().
via c7144b7acd2 s3: smbd: Reformat users of smbd_calculate_access_mask().
via 66a4e6b5c65 s3: smbd: Add a dirfsp parameter to check_parent_access().
via 3e6e9e4281a s3: smbd: Reformat users of check_parent_access().
via c9c8c83ca24 s3: smbd: Add a dirfsp parameter to user_can_read_file().
via f24e1abeee0 s3: smbd: Reformat users of user_can_read_file().
via 49ec754fca7 s3: smbd: Add a dirfsp parameter to smbd_check_access_rights().
via b4acf74049e s3: smbd: Reformat users of smbd_check_access_rights().
via 7c1f1e5243b s3: smbd: Add dirfsp parameter to can_write_to_file().
via 21d16fe2122 s3: smbd: Reformat users of can_write_to_file().
via 18f67e354f3 s3: smbd: Add dirfsp parameter to user_can_write_file().
via 6d83b785cf1 s3: smbd: Reformat caller of user_can_write_file().
via 839a2fb7a5e s3: smbd: Add dirfsp parameter to can_delete_file_in_directory().
via 1a53b81a7bb s3: smbd: Reformat definition and callers of can_delete_file_in_directory().
from 906aa7ddb8f CVE-2020-10700: dsdb: Do not permit the ASQ control for the GUID search in paged_results
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 29cbfd0ba39505ae51442b086fe58bda38c54a69
Author: Jeremy Allison <jra at samba.org>
Date: Fri May 1 10:18:08 2020 -0700
s3: smbd: Add a dirfsp parameter to smbd_calculate_maximum_allowed_access().
Not yet used. Currently always conn->cwd_fsp.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
Autobuild-User(master): Ralph Böhme <slow at samba.org>
Autobuild-Date(master): Mon May 4 15:33:09 UTC 2020 on sn-devel-184
commit 976a60304a7b06d442f47b895bf1d7b5dee6d452
Author: Jeremy Allison <jra at samba.org>
Date: Fri May 1 10:15:14 2020 -0700
s3: smbd: Reformat users of smbd_calculate_maximum_allowed_access().
Make new parameter addition clearer.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit a20d06675f07be676c3920072e15ffe7775ab91c
Author: Jeremy Allison <jra at samba.org>
Date: Fri May 1 10:13:58 2020 -0700
s3: smbd: Add a dirfsp parameter to smbd_calculate_access_mask().
Not yet used. Currently always conn->cwd_fsp.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit c7144b7acd298b2fd06cbe02f163bb905eca450a
Author: Jeremy Allison <jra at samba.org>
Date: Fri May 1 10:09:53 2020 -0700
s3: smbd: Reformat users of smbd_calculate_access_mask().
Make new parameter addition clearer.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 66a4e6b5c6598ff2aa383db8d4de48fa4a805dd2
Author: Jeremy Allison <jra at samba.org>
Date: Thu Apr 30 18:20:29 2020 -0700
s3: smbd: Add a dirfsp parameter to check_parent_access().
Not yet used. Currently always conn->cwd_fsp.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 3e6e9e4281af827eff1ea1407caaa22c76ae2a28
Author: Jeremy Allison <jra at samba.org>
Date: Thu Apr 30 18:16:51 2020 -0700
s3: smbd: Reformat users of check_parent_access().
Make new parameter addition clearer.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit c9c8c83ca24e18a56cefaa257d46615c6b10aec9
Author: Jeremy Allison <jra at samba.org>
Date: Thu Apr 30 16:05:34 2020 -0700
s3: smbd: Add a dirfsp parameter to user_can_read_file().
Not yet used. Currently always conn->cwd_fsp.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit f24e1abeee0e486070816d1cff3e8cfbb25f73e1
Author: Jeremy Allison <jra at samba.org>
Date: Thu Apr 30 16:04:31 2020 -0700
s3: smbd: Reformat users of user_can_read_file().
Make new parameter addition clearer.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 49ec754fca7beaacb852facc6cfecdfedbc89e45
Author: Jeremy Allison <jra at samba.org>
Date: Thu Apr 30 16:02:43 2020 -0700
s3: smbd: Add a dirfsp parameter to smbd_check_access_rights().
Not yet used. Currently always conn->cwd_fsp.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit b4acf74049e49ee876669cd890cfe55f7bb16cb8
Author: Jeremy Allison <jra at samba.org>
Date: Thu Apr 30 15:48:12 2020 -0700
s3: smbd: Reformat users of smbd_check_access_rights().
Make new parameter addition clearer.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 7c1f1e5243bf995746296de9523d75662ce330a0
Author: Jeremy Allison <jra at samba.org>
Date: Thu Apr 30 15:44:37 2020 -0700
s3: smbd: Add dirfsp parameter to can_write_to_file().
Not yet used. Currently always conn->cwd_fsp.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 21d16fe2122cab9b2ed111d76d78b7dd5c8b66df
Author: Jeremy Allison <jra at samba.org>
Date: Thu Apr 30 15:35:36 2020 -0700
s3: smbd: Reformat users of can_write_to_file().
Make new parameter addition clearer.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 18f67e354f36e5b0ddb2f04e41d9463f35d7957c
Author: Jeremy Allison <jra at samba.org>
Date: Thu Apr 30 15:31:43 2020 -0700
s3: smbd: Add dirfsp parameter to user_can_write_file().
Not yet used. Currently always conn->cwd_fsp.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 6d83b785cf1ed38d1077c53f7364a19d97046995
Author: Jeremy Allison <jra at samba.org>
Date: Thu Apr 30 15:30:40 2020 -0700
s3: smbd: Reformat caller of user_can_write_file().
Make new parameter addition clearer.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 839a2fb7a5e7d47ffe1d472e769c30df90c2a7e1
Author: Jeremy Allison <jra at samba.org>
Date: Thu Apr 30 15:28:32 2020 -0700
s3: smbd: Add dirfsp parameter to can_delete_file_in_directory().
Not yet used. Currently always conn->cwd_fsp.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
commit 1a53b81a7bb12cdfaa269ff3b0c44df69cffb49e
Author: Jeremy Allison <jra at samba.org>
Date: Thu Apr 30 15:20:34 2020 -0700
s3: smbd: Reformat definition and callers of can_delete_file_in_directory().
Makes future addition of parameter easier to see.
Signed-off-by: Jeremy Allison <jra at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
-----------------------------------------------------------------------
Summary of changes:
source3/modules/vfs_ceph_snapshots.c | 2 ++
source3/modules/vfs_fruit.c | 1 +
source3/modules/vfs_shadow_copy2.c | 1 +
source3/smbd/dir.c | 22 +++++++++---
source3/smbd/dosmode.c | 26 ++++++++++----
source3/smbd/fake_file.c | 8 +++--
source3/smbd/file_access.c | 15 ++++++--
source3/smbd/globals.h | 9 ++---
source3/smbd/nttrans.c | 10 ++++--
source3/smbd/open.c | 70 ++++++++++++++++++++++++++++--------
source3/smbd/posix_acls.c | 5 ++-
source3/smbd/proto.h | 8 +++--
source3/smbd/reply.c | 8 +++--
source3/smbd/smb2_create.c | 9 ++---
source3/smbd/trans2.c | 1 +
15 files changed, 150 insertions(+), 45 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/modules/vfs_ceph_snapshots.c b/source3/modules/vfs_ceph_snapshots.c
index d2010d8fc52..163772e59c4 100644
--- a/source3/modules/vfs_ceph_snapshots.c
+++ b/source3/modules/vfs_ceph_snapshots.c
@@ -186,6 +186,7 @@ static int ceph_snap_enum_snapdir(struct vfs_handle_struct *handle,
uint32_t slots;
status = smbd_check_access_rights(handle->conn,
+ handle->conn->cwd_fsp,
snaps_dname,
false,
SEC_DIR_LIST);
@@ -572,6 +573,7 @@ static int ceph_snap_gmt_convert_dir(struct vfs_handle_struct *handle,
}
status = smbd_check_access_rights(handle->conn,
+ handle->conn->cwd_fsp,
snaps_dname,
false,
SEC_DIR_LIST);
diff --git a/source3/modules/vfs_fruit.c b/source3/modules/vfs_fruit.c
index 86870f8f9cf..bdfb4f0ff45 100644
--- a/source3/modules/vfs_fruit.c
+++ b/source3/modules/vfs_fruit.c
@@ -4081,6 +4081,7 @@ static NTSTATUS fruit_readdir_attr(struct vfs_handle_struct *handle,
} else {
status = smbd_calculate_access_mask(
handle->conn,
+ handle->conn->cwd_fsp,
fname,
false,
SEC_FLAG_MAXIMUM_ALLOWED,
diff --git a/source3/modules/vfs_shadow_copy2.c b/source3/modules/vfs_shadow_copy2.c
index b57720a73c7..2d7fd0064de 100644
--- a/source3/modules/vfs_shadow_copy2.c
+++ b/source3/modules/vfs_shadow_copy2.c
@@ -1778,6 +1778,7 @@ static bool check_access_snapdir(struct vfs_handle_struct *handle,
}
status = smbd_check_access_rights(handle->conn,
+ handle->conn->cwd_fsp,
&smb_fname,
false,
SEC_DIR_LIST);
diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
index 144f193ffbb..17eeec05577 100644
--- a/source3/smbd/dir.c
+++ b/source3/smbd/dir.c
@@ -1069,7 +1069,8 @@ bool get_dir_entry(TALLOC_CTX *ctx,
********************************************************************/
static bool user_can_read_file(connection_struct *conn,
- struct smb_filename *smb_fname)
+ struct files_struct *dirfsp,
+ struct smb_filename *smb_fname)
{
NTSTATUS status;
uint32_t rejected_share_access = 0;
@@ -1080,6 +1081,8 @@ static bool user_can_read_file(connection_struct *conn,
FILE_READ_ATTRIBUTES|
SEC_STD_READ_CONTROL;
+ SMB_ASSERT(dirfsp == conn->cwd_fsp);
+
/*
* Never hide files from the root user.
* We use (uid_t)0 here not sec_initial_uid()
@@ -1153,8 +1156,11 @@ static bool user_can_read_file(connection_struct *conn,
********************************************************************/
static bool user_can_write_file(connection_struct *conn,
+ struct files_struct *dirfsp,
const struct smb_filename *smb_fname)
{
+ SMB_ASSERT(dirfsp == conn->cwd_fsp);
+
/*
* Never hide files from the root user.
* We use (uid_t)0 here not sec_initial_uid()
@@ -1173,7 +1179,7 @@ static bool user_can_write_file(connection_struct *conn,
return True;
}
- return can_write_to_file(conn, smb_fname);
+ return can_write_to_file(conn, dirfsp, smb_fname);
}
/*******************************************************************
@@ -1272,15 +1278,21 @@ bool is_visible_file(connection_struct *conn,
/* Honour _hide unreadable_ option */
if (hide_unreadable &&
- !user_can_read_file(conn, smb_fname_base)) {
+ !user_can_read_file(conn,
+ conn->cwd_fsp,
+ smb_fname_base))
+ {
DEBUG(10,("is_visible_file: file %s is unreadable.\n",
entry ));
ret = false;
goto out;
}
/* Honour _hide unwriteable_ option */
- if (hide_unwriteable && !user_can_write_file(conn,
- smb_fname_base)) {
+ if (hide_unwriteable &&
+ !user_can_write_file(conn,
+ conn->cwd_fsp,
+ smb_fname_base))
+ {
DEBUG(10,("is_visible_file: file %s is unwritable.\n",
entry ));
ret = false;
diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c
index 7ddc5fd3fc6..a08bb9a55ca 100644
--- a/source3/smbd/dosmode.c
+++ b/source3/smbd/dosmode.c
@@ -219,7 +219,10 @@ static uint32_t dos_mode_from_sbuf(connection_struct *conn,
}
} else if (ro_opts == MAP_READONLY_PERMISSIONS) {
/* Check actual permissions for read-only. */
- if (!can_write_to_file(conn, smb_fname)) {
+ if (!can_write_to_file(conn,
+ conn->cwd_fsp,
+ smb_fname))
+ {
result |= FILE_ATTRIBUTE_READONLY;
}
} /* Else never set the readonly bit. */
@@ -532,14 +535,19 @@ NTSTATUS set_ea_dos_attribute(connection_struct *conn,
return NT_STATUS_ACCESS_DENIED;
}
- status = smbd_check_access_rights(conn, smb_fname, false,
- FILE_WRITE_ATTRIBUTES);
+ status = smbd_check_access_rights(conn,
+ conn->cwd_fsp,
+ smb_fname,
+ false,
+ FILE_WRITE_ATTRIBUTES);
if (NT_STATUS_IS_OK(status)) {
set_dosmode_ok = true;
}
if (!set_dosmode_ok && lp_dos_filemode(SNUM(conn))) {
- set_dosmode_ok = can_write_to_file(conn, smb_fname);
+ set_dosmode_ok = can_write_to_file(conn,
+ conn->cwd_fsp,
+ smb_fname);
}
if (!set_dosmode_ok) {
@@ -1069,7 +1077,10 @@ int file_set_dosmode(connection_struct *conn,
bits on a file. Just like file_ntimes below.
*/
- if (!can_write_to_file(conn, smb_fname)) {
+ if (!can_write_to_file(conn,
+ conn->cwd_fsp,
+ smb_fname))
+ {
errno = EACCES;
return -1;
}
@@ -1242,7 +1253,10 @@ int file_ntimes(connection_struct *conn, const struct smb_filename *smb_fname,
*/
/* Check if we have write access. */
- if (can_write_to_file(conn, smb_fname)) {
+ if (can_write_to_file(conn,
+ conn->cwd_fsp,
+ smb_fname))
+ {
/* We are allowed to become root and change the filetime. */
become_root();
ret = SMB_VFS_NTIMES(conn, smb_fname, ft);
diff --git a/source3/smbd/fake_file.c b/source3/smbd/fake_file.c
index 625c21ff8bd..90921a65e36 100644
--- a/source3/smbd/fake_file.c
+++ b/source3/smbd/fake_file.c
@@ -131,8 +131,12 @@ NTSTATUS open_fake_file(struct smb_request *req, connection_struct *conn,
files_struct *fsp = NULL;
NTSTATUS status;
- status = smbd_calculate_access_mask(conn, smb_fname, false,
- access_mask, &access_mask);
+ status = smbd_calculate_access_mask(conn,
+ conn->cwd_fsp,
+ smb_fname,
+ false,
+ access_mask,
+ &access_mask);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(10, ("open_fake_file: smbd_calculate_access_mask "
"on service[%s] file[%s] returned %s\n",
diff --git a/source3/smbd/file_access.c b/source3/smbd/file_access.c
index 42936478f92..35ee81b47dd 100644
--- a/source3/smbd/file_access.c
+++ b/source3/smbd/file_access.c
@@ -33,12 +33,15 @@
****************************************************************************/
bool can_delete_file_in_directory(connection_struct *conn,
- const struct smb_filename *smb_fname)
+ struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname)
{
TALLOC_CTX *ctx = talloc_tos();
struct smb_filename *smb_fname_parent = NULL;
bool ret;
+ SMB_ASSERT(dirfsp == conn->cwd_fsp);
+
if (!CAN_WRITE(conn)) {
return False;
}
@@ -114,7 +117,12 @@ bool can_delete_file_in_directory(connection_struct *conn,
* check the file DELETE permission separately.
*/
+ /*
+ * NB. When dirfsp != conn->cwd_fsp, we must
+ * change smb_fname_parent to be "." for the name here.
+ */
ret = NT_STATUS_IS_OK(smbd_check_access_rights(conn,
+ dirfsp,
smb_fname_parent,
false,
FILE_DELETE_CHILD));
@@ -128,9 +136,12 @@ bool can_delete_file_in_directory(connection_struct *conn,
****************************************************************************/
bool can_write_to_file(connection_struct *conn,
- const struct smb_filename *smb_fname)
+ struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname)
{
+ SMB_ASSERT(dirfsp == conn->cwd_fsp);
return NT_STATUS_IS_OK(smbd_check_access_rights(conn,
+ dirfsp,
smb_fname,
false,
FILE_WRITE_DATA));
diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index cbd66e99ac8..79086b3c81c 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -212,10 +212,11 @@ NTSTATUS smbd_dirptr_lanman2_entry(TALLOC_CTX *ctx,
struct file_id *file_id);
NTSTATUS smbd_calculate_access_mask(connection_struct *conn,
- const struct smb_filename *smb_fname,
- bool use_privs,
- uint32_t access_mask,
- uint32_t *access_mask_out);
+ struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname,
+ bool use_privs,
+ uint32_t access_mask,
+ uint32_t *access_mask_out);
void smbd_notify_cancel_by_smbreq(const struct smb_request *smbreq);
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index a99aa78bde8..e83ccc25ac4 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -726,7 +726,10 @@ void reply_ntcreate_and_X(struct smb_request *req)
p += 25;
if (fsp->fsp_flags.is_directory ||
fsp->fsp_flags.can_write ||
- can_write_to_file(conn, smb_fname)) {
+ can_write_to_file(conn,
+ conn->cwd_fsp,
+ smb_fname))
+ {
perms = FILE_GENERIC_ALL;
} else {
perms = FILE_GENERIC_READ|FILE_EXECUTE;
@@ -1388,7 +1391,10 @@ static void call_nt_transact_create(connection_struct *conn,
p += 25;
if (fsp->fsp_flags.is_directory ||
fsp->fsp_flags.can_write ||
- can_write_to_file(conn, smb_fname)) {
+ can_write_to_file(conn,
+ conn->cwd_fsp,
+ smb_fname))
+ {
perms = FILE_GENERIC_ALL;
} else {
perms = FILE_GENERIC_READ|FILE_EXECUTE;
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 8383fe1df5c..5f612533267 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -81,7 +81,10 @@ static bool parent_override_delete(connection_struct *conn,
{
if ((access_mask & DELETE_ACCESS) &&
(rejected_mask & DELETE_ACCESS) &&
- can_delete_file_in_directory(conn, smb_fname)) {
+ can_delete_file_in_directory(conn,
+ conn->cwd_fsp,
+ smb_fname))
+ {
return true;
}
return false;
@@ -92,6 +95,7 @@ static bool parent_override_delete(connection_struct *conn,
****************************************************************************/
NTSTATUS smbd_check_access_rights(struct connection_struct *conn,
+ struct files_struct *dirfsp,
const struct smb_filename *smb_fname,
bool use_privs,
uint32_t access_mask)
@@ -103,6 +107,8 @@ NTSTATUS smbd_check_access_rights(struct connection_struct *conn,
uint32_t rejected_mask = access_mask;
uint32_t do_not_check_mask = 0;
+ SMB_ASSERT(dirfsp == conn->cwd_fsp);
+
rejected_share_access = access_mask & ~(conn->share_access);
if (rejected_share_access) {
@@ -258,6 +264,7 @@ NTSTATUS smbd_check_access_rights(struct connection_struct *conn,
}
NTSTATUS check_parent_access(struct connection_struct *conn,
+ struct files_struct *dirfsp,
struct smb_filename *smb_fname,
uint32_t access_mask)
{
@@ -273,6 +280,13 @@ NTSTATUS check_parent_access(struct connection_struct *conn,
TALLOC_CTX *frame = talloc_stackframe();
bool ok;
+ /*
+ * NB. When dirfsp != conn->cwd_fsp, we must
+ * change parent_dir to be "." for the name here.
+ */
+
+ SMB_ASSERT(dirfsp == conn->cwd_fsp);
+
ok = parent_smb_fname(frame, smb_fname, &parent_dir, NULL);
if (!ok) {
status = NT_STATUS_NO_MEMORY;
@@ -383,7 +397,9 @@ static NTSTATUS check_base_file_access(struct connection_struct *conn,
{
NTSTATUS status;
- status = smbd_calculate_access_mask(conn, smb_fname,
+ status = smbd_calculate_access_mask(conn,
+ conn->cwd_fsp,
+ smb_fname,
false,
access_mask,
&access_mask);
@@ -407,6 +423,7 @@ static NTSTATUS check_base_file_access(struct connection_struct *conn,
}
return smbd_check_access_rights(conn,
+ conn->cwd_fsp,
smb_fname,
false,
access_mask);
@@ -1209,6 +1226,7 @@ static NTSTATUS open_file(files_struct *fsp,
/* Only do this check on non-stream open. */
if (file_existed) {
status = smbd_check_access_rights(conn,
+ conn->cwd_fsp,
smb_fname,
false,
access_mask);
@@ -1247,8 +1265,9 @@ static NTSTATUS open_file(files_struct *fsp,
}
status = check_parent_access(conn,
- smb_fname,
- SEC_DIR_ADD_FILE);
+ conn->cwd_fsp,
+ smb_fname,
+ SEC_DIR_ADD_FILE);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(10, ("open_file: "
"check_parent_access on "
@@ -1352,6 +1371,7 @@ static NTSTATUS open_file(files_struct *fsp,
}
status = smbd_check_access_rights(conn,
+ conn->cwd_fsp,
smb_fname,
false,
access_mask);
@@ -3011,6 +3031,7 @@ static void schedule_async_open(struct smb_request *req)
static NTSTATUS smbd_calculate_maximum_allowed_access(
connection_struct *conn,
+ struct files_struct *dirfsp,
const struct smb_filename *smb_fname,
bool use_privs,
uint32_t *p_access_mask)
@@ -3019,6 +3040,8 @@ static NTSTATUS smbd_calculate_maximum_allowed_access(
uint32_t access_granted;
NTSTATUS status;
+ SMB_ASSERT(dirfsp == conn->cwd_fsp);
+
if (!use_privs && (get_current_uid(conn) == (uid_t)0)) {
*p_access_mask |= FILE_GENERIC_ALL;
return NT_STATUS_OK;
@@ -3071,7 +3094,10 @@ static NTSTATUS smbd_calculate_maximum_allowed_access(
*p_access_mask = (access_granted | FILE_READ_ATTRIBUTES);
if (!(access_granted & DELETE_ACCESS)) {
- if (can_delete_file_in_directory(conn, smb_fname)) {
+ if (can_delete_file_in_directory(conn,
+ conn->cwd_fsp,
+ smb_fname))
+ {
*p_access_mask |= DELETE_ACCESS;
}
}
@@ -3080,15 +3106,18 @@ static NTSTATUS smbd_calculate_maximum_allowed_access(
}
NTSTATUS smbd_calculate_access_mask(connection_struct *conn,
- const struct smb_filename *smb_fname,
- bool use_privs,
- uint32_t access_mask,
- uint32_t *access_mask_out)
+ struct files_struct *dirfsp,
+ const struct smb_filename *smb_fname,
+ bool use_privs,
+ uint32_t access_mask,
+ uint32_t *access_mask_out)
{
NTSTATUS status;
uint32_t orig_access_mask = access_mask;
uint32_t rejected_share_access;
+ SMB_ASSERT(dirfsp == conn->cwd_fsp);
+
if (access_mask & SEC_MASK_INVALID) {
DBG_DEBUG("access_mask [%8x] contains invalid bits\n",
access_mask);
@@ -3104,8 +3133,11 @@ NTSTATUS smbd_calculate_access_mask(connection_struct *conn,
/* Calculate MAXIMUM_ALLOWED_ACCESS if requested. */
if (access_mask & MAXIMUM_ALLOWED_ACCESS) {
- status = smbd_calculate_maximum_allowed_access(
- conn, smb_fname, use_privs, &access_mask);
+ status = smbd_calculate_maximum_allowed_access(conn,
+ dirfsp,
+ smb_fname,
+ use_privs,
+ &access_mask);
if (!NT_STATUS_IS_OK(status)) {
return status;
@@ -3484,10 +3516,12 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn,
}
}
- status = smbd_calculate_access_mask(conn, smb_fname,
+ status = smbd_calculate_access_mask(conn,
+ conn->cwd_fsp,
+ smb_fname,
false,
access_mask,
- &access_mask);
+ &access_mask);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(10, ("open_file_ntcreate: smbd_calculate_access_mask "
"on file %s returned %s\n",
@@ -4100,6 +4134,7 @@ static NTSTATUS mkdir_internal(connection_struct *conn,
}
status = check_parent_access(conn,
+ conn->cwd_fsp,
smb_dname,
access_mask);
if(!NT_STATUS_IS_OK(status)) {
@@ -4241,8 +4276,12 @@ static NTSTATUS open_directory(connection_struct *conn,
create_disposition,
file_attributes);
- status = smbd_calculate_access_mask(conn, smb_dname, false,
- access_mask, &access_mask);
+ status = smbd_calculate_access_mask(conn,
+ conn->cwd_fsp,
+ smb_dname,
+ false,
+ access_mask,
+ &access_mask);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(10, ("open_directory: smbd_calculate_access_mask "
"on file %s returned %s\n",
@@ -4367,6 +4406,7 @@ static NTSTATUS open_directory(connection_struct *conn,
if (info == FILE_WAS_OPENED) {
--
Samba Shared Repository
More information about the samba-cvs
mailing list