The branch, master has been updated
       via  8de46ea Add 'bool use_privs' to smbd_calculate_access_mask().
       via  6d82976 Fix bad string in debug message (remove it).
       via  aa0a7cf Add bool use_privs parameter to smbd_check_access_rights()
       via  1e34d58 Add "backup_intent" bool.
       via  b66bcab Don't call can_write_to_file() if we already have 
'fsp->can_write' set.
      from  35a4a1e build: Fix build on systems without ldap development headers

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 8de46eac65deb33cd91fa242fb89fb59dc3cac42
Author: Jeremy Allison <[email protected]>
Date:   Thu Sep 13 17:12:24 2012 -0700

    Add 'bool use_privs' to smbd_calculate_access_mask().
    
    Replaces blanket root allow if set. Set to 'false' for
    all current callers.
    
    Autobuild-User(master): Jeremy Allison <[email protected]>
    Autobuild-Date(master): Sat Sep 15 00:37:49 CEST 2012 on sn-devel-104

commit 6d82976597d6418005a889781cc23adf6b3090c3
Author: Jeremy Allison <[email protected]>
Date:   Thu Sep 13 17:08:43 2012 -0700

    Fix bad string in debug message (remove it).

commit aa0a7cf51a8b4ed2f188c2c38c4d5d47688de9ad
Author: Jeremy Allison <[email protected]>
Date:   Thu Sep 13 16:11:31 2012 -0700

    Add bool use_privs parameter to smbd_check_access_rights()
    
    If this is set we should use it in preference to blindly assuming
    root can do anything. Currently set to 'false' in (most) callers.

commit 1e34d584393c09a43bf0226bebc0ae0f675e57ae
Author: Jeremy Allison <[email protected]>
Date:   Thu Sep 13 15:35:21 2012 -0700

    Add "backup_intent" bool.

commit b66bcab58ce73f86424b9a6ffbf9d3634e42f8ae
Author: Jeremy Allison <[email protected]>
Date:   Thu Sep 13 14:36:57 2012 -0700

    Don't call can_write_to_file() if we already have 'fsp->can_write' set.

-----------------------------------------------------------------------

Summary of changes:
 source3/smbd/dir.c         |    5 ++++-
 source3/smbd/fake_file.c   |    2 +-
 source3/smbd/file_access.c |    2 ++
 source3/smbd/globals.h     |    1 +
 source3/smbd/nttrans.c     |    2 ++
 source3/smbd/open.c        |   33 +++++++++++++++++++++------------
 source3/smbd/proto.h       |    1 +
 source3/smbd/smb2_create.c |    1 +
 source3/smbd/trans2.c      |    1 +
 9 files changed, 34 insertions(+), 14 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/smbd/dir.c b/source3/smbd/dir.c
index cb27110..e12812e 100644
--- a/source3/smbd/dir.c
+++ b/source3/smbd/dir.c
@@ -510,6 +510,7 @@ NTSTATUS dptr_create(connection_struct *conn,
                dir_hnd = OpenDir_fsp(NULL, conn, fsp, wcard, attr);
        } else {
                int ret;
+               bool backup_intent = (req && req->priv_paths);
                struct smb_filename *smb_dname = NULL;
                NTSTATUS status = create_synthetic_smb_fname(talloc_tos(),
                                                path,
@@ -532,11 +533,12 @@ NTSTATUS dptr_create(connection_struct *conn,
                }
                status = smbd_check_access_rights(conn,
                                                smb_dname,
+                                               backup_intent,
                                                SEC_DIR_LIST);
                if (!NT_STATUS_IS_OK(status)) {
                        return status;
                }
-               if (req && req->priv_paths) {
+               if (backup_intent) {
                        dir_hnd = open_dir_with_privilege(conn,
                                                req,
                                                path,
@@ -1280,6 +1282,7 @@ static bool user_can_read_file(connection_struct *conn,
 
        return NT_STATUS_IS_OK(smbd_check_access_rights(conn,
                                smb_fname,
+                               false,
                                FILE_READ_DATA));
 }
 
diff --git a/source3/smbd/fake_file.c b/source3/smbd/fake_file.c
index d052d49..3f9e2ae 100644
--- a/source3/smbd/fake_file.c
+++ b/source3/smbd/fake_file.c
@@ -129,7 +129,7 @@ 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,
+       status = smbd_calculate_access_mask(conn, smb_fname, false,
                                            access_mask, &access_mask);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(10, ("open_fake_file: smbd_calculate_access_mask "
diff --git a/source3/smbd/file_access.c b/source3/smbd/file_access.c
index 6ced6a6..015679d 100644
--- a/source3/smbd/file_access.c
+++ b/source3/smbd/file_access.c
@@ -124,6 +124,7 @@ bool can_delete_file_in_directory(connection_struct *conn,
 
        ret = NT_STATUS_IS_OK(smbd_check_access_rights(conn,
                                smb_fname_parent,
+                               false,
                                FILE_DELETE_CHILD));
  out:
        TALLOC_FREE(dname);
@@ -140,6 +141,7 @@ bool can_write_to_file(connection_struct *conn,
 {
        return NT_STATUS_IS_OK(smbd_check_access_rights(conn,
                                smb_fname,
+                               false,
                                FILE_WRITE_DATA));
 }
 
diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h
index 566f04d..74e42c7 100644
--- a/source3/smbd/globals.h
+++ b/source3/smbd/globals.h
@@ -202,6 +202,7 @@ bool smbd_dirptr_lanman2_entry(TALLOC_CTX *ctx,
 
 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);
 
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
index 997f721..6848d10 100644
--- a/source3/smbd/nttrans.c
+++ b/source3/smbd/nttrans.c
@@ -718,6 +718,7 @@ void reply_ntcreate_and_X(struct smb_request *req)
                uint32 perms = 0;
                p += 25;
                if (fsp->is_directory ||
+                   fsp->can_write ||
                    can_write_to_file(conn, smb_fname)) {
                        perms = FILE_GENERIC_ALL;
                } else {
@@ -1345,6 +1346,7 @@ static void call_nt_transact_create(connection_struct 
*conn,
                uint32 perms = 0;
                p += 25;
                if (fsp->is_directory ||
+                   fsp->can_write ||
                    can_write_to_file(conn, smb_fname)) {
                        perms = FILE_GENERIC_ALL;
                } else {
diff --git a/source3/smbd/open.c b/source3/smbd/open.c
index 0da2386..b67c045 100644
--- a/source3/smbd/open.c
+++ b/source3/smbd/open.c
@@ -65,6 +65,7 @@ static bool parent_override_delete(connection_struct *conn,
 
 NTSTATUS smbd_check_access_rights(struct connection_struct *conn,
                                const struct smb_filename *smb_fname,
+                               bool use_privs,
                                uint32_t access_mask)
 {
        /* Check if we have rights to open. */
@@ -84,7 +85,7 @@ NTSTATUS smbd_check_access_rights(struct connection_struct 
*conn,
                return NT_STATUS_ACCESS_DENIED;
        }
 
-       if (get_current_uid(conn) == (uid_t)0) {
+       if (!use_privs && get_current_uid(conn) == (uid_t)0) {
                /* I'm sorry sir, I didn't know you were root... */
                DEBUG(10,("smbd_check_access_rights: root override "
                        "on %s. Granting 0x%x\n",
@@ -135,7 +136,7 @@ NTSTATUS smbd_check_access_rights(struct connection_struct 
*conn,
         */
        status = se_file_access_check(sd,
                                get_current_nttok(conn),
-                               false,
+                               use_privs,
                                (access_mask & ~FILE_READ_ATTRIBUTES),
                                &rejected_mask);
 
@@ -745,6 +746,7 @@ static NTSTATUS open_file(files_struct *fsp,
                        if (file_existed) {
                                status = smbd_check_access_rights(conn,
                                                smb_fname,
+                                               false,
                                                access_mask);
                        } else if (local_flags & O_CREAT){
                                status = check_parent_access(conn,
@@ -836,6 +838,7 @@ static NTSTATUS open_file(files_struct *fsp,
 
                status = smbd_check_access_rights(conn,
                                smb_fname,
+                               false,
                                access_mask);
 
                if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND) &&
@@ -1659,13 +1662,14 @@ static void schedule_async_open(struct timeval 
request_time,
 static NTSTATUS smbd_calculate_maximum_allowed_access(
        connection_struct *conn,
        const struct smb_filename *smb_fname,
+       bool use_privs,
        uint32_t *p_access_mask)
 {
        struct security_descriptor *sd;
        uint32_t access_granted;
        NTSTATUS status;
 
-       if (get_current_uid(conn) == (uid_t)0) {
+       if (!use_privs && (get_current_uid(conn) == (uid_t)0)) {
                *p_access_mask |= FILE_GENERIC_ALL;
                return NT_STATUS_OK;
        }
@@ -1683,8 +1687,7 @@ static NTSTATUS smbd_calculate_maximum_allowed_access(
                return NT_STATUS_OK;
        }
        if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(10,("smbd_calculate_access_mask: "
-                         "Could not get acl on file %s: %s\n",
+               DEBUG(10,("Could not get acl on file %s: %s\n",
                          smb_fname_str_dbg(smb_fname),
                          nt_errstr(status)));
                return NT_STATUS_ACCESS_DENIED;
@@ -1696,15 +1699,14 @@ static NTSTATUS smbd_calculate_maximum_allowed_access(
         */
        status = se_file_access_check(sd,
                                 get_current_nttok(conn),
-                                false,
+                                use_privs,
                                 (*p_access_mask & ~FILE_READ_ATTRIBUTES),
                                 &access_granted);
 
        TALLOC_FREE(sd);
 
        if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(10, ("smbd_calculate_access_mask: "
-                          "Access denied on file %s: "
+               DEBUG(10, ("Access denied on file %s: "
                           "when calculating maximum access\n",
                           smb_fname_str_dbg(smb_fname)));
                return NT_STATUS_ACCESS_DENIED;
@@ -1715,6 +1717,7 @@ 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)
 {
@@ -1732,7 +1735,7 @@ NTSTATUS smbd_calculate_access_mask(connection_struct 
*conn,
        if (access_mask & MAXIMUM_ALLOWED_ACCESS) {
 
                status = smbd_calculate_maximum_allowed_access(
-                       conn, smb_fname, &access_mask);
+                       conn, smb_fname, use_privs, &access_mask);
 
                if (!NT_STATUS_IS_OK(status)) {
                        return status;
@@ -2084,6 +2087,7 @@ static NTSTATUS open_file_ntcreate(connection_struct 
*conn,
        }
 
        status = smbd_calculate_access_mask(conn, smb_fname,
+                                       false,
                                        access_mask,
                                        &access_mask); 
        if (!NT_STATUS_IS_OK(status)) {
@@ -2308,7 +2312,9 @@ static NTSTATUS open_file_ntcreate(connection_struct 
*conn,
                        if (((can_access_mask & FILE_WRITE_DATA) &&
                                !CAN_WRITE(conn)) ||
                                !NT_STATUS_IS_OK(smbd_check_access_rights(conn,
-                                               smb_fname, can_access_mask))) {
+                                                       smb_fname,
+                                                       false,
+                                                       can_access_mask))) {
                                can_access = False;
                        }
 
@@ -2919,7 +2925,7 @@ static NTSTATUS open_directory(connection_struct *conn,
                 (unsigned int)create_disposition,
                 (unsigned int)file_attributes));
 
-       status = smbd_calculate_access_mask(conn, smb_dname,
+       status = smbd_calculate_access_mask(conn, smb_dname, false,
                                            access_mask, &access_mask);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(10, ("open_directory: smbd_calculate_access_mask "
@@ -3025,7 +3031,10 @@ static NTSTATUS open_directory(connection_struct *conn,
        }
 
        if (info == FILE_WAS_OPENED) {
-               status = smbd_check_access_rights(conn, smb_dname, access_mask);
+               status = smbd_check_access_rights(conn,
+                                               smb_dname,
+                                               false,
+                                               access_mask);
                if (!NT_STATUS_IS_OK(status)) {
                        DEBUG(10, ("open_directory: smbd_check_access_rights on 
"
                                "file %s failed with %s\n",
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index 5d6a299..a1cef16 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -598,6 +598,7 @@ void reply_nttranss(struct smb_request *req);
 
 NTSTATUS smbd_check_access_rights(struct connection_struct *conn,
                                const struct smb_filename *smb_fname,
+                               bool use_privs,
                                uint32_t access_mask);
 NTSTATUS fd_open(struct connection_struct *conn, files_struct *fsp,
                 int flags, mode_t mode);
diff --git a/source3/smbd/smb2_create.c b/source3/smbd/smb2_create.c
index 331ca49..0d9a146 100644
--- a/source3/smbd/smb2_create.c
+++ b/source3/smbd/smb2_create.c
@@ -932,6 +932,7 @@ static struct tevent_req *smbd_smb2_create_send(TALLOC_CTX 
*mem_ctx,
 
                                status = 
smbd_calculate_access_mask(smb1req->conn,
                                                        result->fsp_name,
+                                                       false,
                                                        
SEC_FLAG_MAXIMUM_ALLOWED,
                                                        &max_access_granted);
 
diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
index 2bc85bf..d108ee6 100644
--- a/source3/smbd/trans2.c
+++ b/source3/smbd/trans2.c
@@ -67,6 +67,7 @@ NTSTATUS check_access(connection_struct *conn,
        } else {
                NTSTATUS status = smbd_check_access_rights(conn,
                                        smb_fname,
+                                       false,
                                        access_mask);
                if (!NT_STATUS_IS_OK(status)) {
                        return status;


-- 
Samba Shared Repository

Reply via email to