s3: smbd: Add a dirfsp parameter to smbd_check_access_rights().
[amitay/samba.git] / source3 / smbd / trans2.c
index 21e77b5c3b8d8606292173bb9d8646eeaca784c8..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;
        }