s3: smbd: Add a dirfsp parameter to smbd_check_access_rights().
[amitay/samba.git] / source3 / smbd / trans2.c
index 19706d32bd5d24b4b85aae3a26066a40c79ef273..65c50336f6f179ab915574a8a0c5ac00b7a9e2c5 100644 (file)
@@ -192,24 +192,20 @@ done:
 #endif
 
 /********************************************************************
- The canonical "check access" based on object handle or path function.
+ The canonical "check access" based on path.
 ********************************************************************/
 
 static NTSTATUS check_access(connection_struct *conn,
-                            files_struct *fsp,
-                            const struct smb_filename *smb_fname,
-                            uint32_t access_mask)
+                       struct files_struct *dirfsp,
+                       const struct smb_filename *smb_fname,
+                       uint32_t access_mask)
 {
-       NTSTATUS status;
-
-       if (fsp) {
-               status = check_access_fsp(fsp, access_mask);
-       } else {
-               status = smbd_check_access_rights(conn, smb_fname,
-                                                 false, access_mask);
-       }
-
-       return status;
+       SMB_ASSERT(dirfsp == dirfsp->conn->cwd_fsp);
+       return smbd_check_access_rights(conn,
+                       dirfsp,
+                       smb_fname,
+                       false,
+                       access_mask);
 }
 
 /********************************************************************
@@ -820,7 +816,14 @@ NTSTATUS set_ea(connection_struct *conn, files_struct *fsp,
                return status;
        }
 
-       status = check_access(conn, fsp, smb_fname, FILE_WRITE_EA);
+       if (fsp != NULL) {
+               status = check_access_fsp(fsp, FILE_WRITE_EA);
+       } else {
+               status = check_access(conn,
+                               conn->cwd_fsp,
+                               smb_fname,
+                               FILE_WRITE_EA);
+       }
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
@@ -7833,7 +7836,14 @@ static NTSTATUS smb_set_file_basic_info(connection_struct *conn,
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       status = check_access(conn, fsp, smb_fname, FILE_WRITE_ATTRIBUTES);
+       if (fsp != NULL) {
+               status = check_access_fsp(fsp, FILE_WRITE_ATTRIBUTES);
+       } else {
+               status = check_access(conn,
+                               conn->cwd_fsp,
+                               smb_fname,
+                               FILE_WRITE_ATTRIBUTES);
+       }
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
@@ -7900,7 +7910,14 @@ static NTSTATUS smb_set_info_standard(connection_struct *conn,
        DEBUG(10,("smb_set_info_standard: file %s\n",
                smb_fname_str_dbg(smb_fname)));
 
-       status = check_access(conn, fsp, smb_fname, FILE_WRITE_ATTRIBUTES);
+       if (fsp != NULL) {
+               status = check_access_fsp(fsp, FILE_WRITE_ATTRIBUTES);
+       } else {
+               status = check_access(conn,
+                               conn->cwd_fsp,
+                               smb_fname,
+                               FILE_WRITE_ATTRIBUTES);
+       }
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }
@@ -8143,14 +8160,21 @@ static NTSTATUS smb_unix_mknod(connection_struct *conn,
         */
 
        if (lp_inherit_permissions(SNUM(conn))) {
-               char *parent;
-               if (!parent_dirname(talloc_tos(), smb_fname->base_name,
-                                   &parent, NULL)) {
+               struct smb_filename *parent_fname = NULL;
+               bool ok;
+
+               ok = parent_smb_fname(talloc_tos(),
+                                     smb_fname,
+                                     &parent_fname,
+                                     NULL);
+               if (!ok) {
                        return NT_STATUS_NO_MEMORY;
                }
-               inherit_access_posix_acl(conn, parent, smb_fname,
+               inherit_access_posix_acl(conn,
+                                        parent_fname,
+                                        smb_fname,
                                         unixmode);
-               TALLOC_FREE(parent);
+               TALLOC_FREE(parent_fname);
        }
 
        return NT_STATUS_OK;