Missed a couple more uses of conn->server_info->ptok that need to be get_current_ntto...
authorJeremy Allison <jra@samba.org>
Fri, 12 Mar 2010 22:31:47 +0000 (14:31 -0800)
committerJeremy Allison <jra@samba.org>
Fri, 12 Mar 2010 22:31:47 +0000 (14:31 -0800)
Centralize the root check into smb1_file_se_access_check()
so this is used by modules/vfs_acl_common.c also.

Jeremy.

source3/include/proto.h
source3/modules/vfs_acl_common.c
source3/smbd/open.c

index 5b4304d27d6ba7086394cc660b63c93a60d106d3..6e210de4582dd270d9546515974c5b53be25bd21 100644 (file)
@@ -6594,10 +6594,11 @@ void reply_nttranss(struct smb_request *req);
 
 /* The following definitions come from smbd/open.c  */
 
-NTSTATUS smb1_file_se_access_check(const struct security_descriptor *sd,
-                          const NT_USER_TOKEN *token,
-                          uint32_t access_desired,
-                          uint32_t *access_granted);
+NTSTATUS smb1_file_se_access_check(connection_struct *conn,
+                               const struct security_descriptor *sd,
+                               const NT_USER_TOKEN *token,
+                               uint32_t access_desired,
+                               uint32_t *access_granted);
 NTSTATUS fd_close(files_struct *fsp);
 void change_file_owner_to_parent(connection_struct *conn,
                                 const char *inherit_from_dir,
index 5d6cfe7f3e69630ce41bde7152de48995154e94c..9e356b933e91009385ab8f14d8b4c7c0141d2544 100644 (file)
@@ -471,8 +471,12 @@ static NTSTATUS check_parent_acl_common(vfs_handle_struct *handle,
                        nt_errstr(status) ));
                return status;
        }
-       status = smb1_file_se_access_check(parent_desc,
-                                       handle->conn->server_info->ptok,
+       if (pp_parent_desc) {
+               *pp_parent_desc = parent_desc;
+       }
+       status = smb1_file_se_access_check(handle->conn,
+                                       parent_desc,
+                                       get_current_nttok(handle->conn),
                                        access_mask,
                                        &access_granted);
        if(!NT_STATUS_IS_OK(status)) {
@@ -485,9 +489,6 @@ static NTSTATUS check_parent_acl_common(vfs_handle_struct *handle,
                        nt_errstr(status) ));
                return status;
        }
-       if (pp_parent_desc) {
-               *pp_parent_desc = parent_desc;
-       }
        return NT_STATUS_OK;
 }
 
@@ -535,8 +536,9 @@ static int open_acl_common(vfs_handle_struct *handle,
                                &pdesc);
         if (NT_STATUS_IS_OK(status)) {
                /* See if we can access it. */
-               status = smb1_file_se_access_check(pdesc,
-                                       handle->conn->server_info->ptok,
+               status = smb1_file_se_access_check(handle->conn,
+                                       pdesc,
+                                       get_current_nttok(handle->conn),
                                        fsp->access_mask,
                                        &access_granted);
                if (!NT_STATUS_IS_OK(status)) {
index 3eb727f96bda664b3b6783303f0f9f4ae2d4e127..0834e6d3d3950c679c6f67b05cf76f16ecb0bbf9 100644 (file)
@@ -50,11 +50,23 @@ static NTSTATUS create_file_unixpath(connection_struct *conn,
  SMB1 file varient of se_access_check. Never test FILE_READ_ATTRIBUTES.
 ****************************************************************************/
 
-NTSTATUS smb1_file_se_access_check(const struct security_descriptor *sd,
-                          const NT_USER_TOKEN *token,
-                          uint32_t access_desired,
-                          uint32_t *access_granted)
+NTSTATUS smb1_file_se_access_check(struct connection_struct *conn,
+                               const struct security_descriptor *sd,
+                               const NT_USER_TOKEN *token,
+                               uint32_t access_desired,
+                               uint32_t *access_granted)
 {
+       *access_granted = 0;
+
+       if (get_current_uid(conn) == (uid_t)0) {
+               /* I'm sorry sir, I didn't know you were root... */
+               *access_granted = access_desired;
+               if (access_desired & SEC_FLAG_MAXIMUM_ALLOWED) {
+                       *access_granted |= FILE_GENERIC_ALL;
+               }
+               return NT_STATUS_OK;
+       }
+
        return se_access_check(sd,
                                token,
                                (access_desired & ~FILE_READ_ATTRIBUTES),
@@ -74,17 +86,6 @@ NTSTATUS smbd_check_open_rights(struct connection_struct *conn,
        NTSTATUS status;
        struct security_descriptor *sd = NULL;
 
-       *access_granted = 0;
-
-       if (get_current_uid(conn) == (uid_t)0) {
-               /* I'm sorry sir, I didn't know you were root... */
-               *access_granted = access_mask;
-               if (access_mask & SEC_FLAG_MAXIMUM_ALLOWED) {
-                       *access_granted |= FILE_GENERIC_ALL;
-               }
-               return NT_STATUS_OK;
-       }
-
        status = SMB_VFS_GET_NT_ACL(conn, smb_fname->base_name,
                        (OWNER_SECURITY_INFORMATION |
                        GROUP_SECURITY_INFORMATION |
@@ -98,8 +99,9 @@ NTSTATUS smbd_check_open_rights(struct connection_struct *conn,
                return status;
        }
 
-       status = smb1_file_se_access_check(sd,
-                               conn->server_info->ptok,
+       status = smb1_file_se_access_check(conn,
+                               sd,
+                               get_current_nttok(conn),
                                access_mask,
                                access_granted);
 
@@ -1419,8 +1421,9 @@ static NTSTATUS calculate_access_mask(connection_struct *conn,
                                return NT_STATUS_ACCESS_DENIED;
                        }
 
-                       status = smb1_file_se_access_check(sd,
-                                       conn->server_info->ptok,
+                       status = smb1_file_se_access_check(conn,
+                                       sd,
+                                       get_current_nttok(conn),
                                        access_mask,
                                        &access_granted);