Try and fix bug #5315, as well as S4 torture tests RAW-OPLOCK BATCH19,
authorJeremy Allison <jra@samba.org>
Tue, 11 Mar 2008 20:27:33 +0000 (13:27 -0700)
committerJeremy Allison <jra@samba.org>
Tue, 11 Mar 2008 20:27:33 +0000 (13:27 -0700)
BATCH20 and RAW-RENAME.
Jeremy.

source/smbd/nttrans.c
source/smbd/reply.c
source/smbd/trans2.c

index 5293ca534766a3c8a243024f575719600c4fb60b..f67ddd3b31d31b103b914daf4fc86b02cd63b210 100644 (file)
@@ -1353,7 +1353,7 @@ void reply_ntrename(struct smb_request *req)
                case RENAME_FLAG_RENAME:
                        status = rename_internals(ctx, conn, req, oldname,
                                        newname, attrs, False, src_has_wcard,
-                                       dest_has_wcard);
+                                       dest_has_wcard, DELETE_ACCESS);
                        break;
                case RENAME_FLAG_HARD_LINK:
                        if (src_has_wcard || dest_has_wcard) {
@@ -1549,7 +1549,8 @@ static void call_nt_transact_rename(connection_struct *conn,
                        0,
                        replace_if_exists,
                        False,
-                       dest_has_wcard);
+                       dest_has_wcard,
+                       DELETE_ACCESS);
 
        if (!NT_STATUS_IS_OK(status)) {
                if (open_was_deferred(req->mid)) {
index 818ff319e4ba2a1c3f4eecadabeca6370673f559..d3b5dfac64e1c1bf3292c7e1c1a49a425d81b8e1 100644 (file)
@@ -2184,7 +2184,7 @@ static NTSTATUS can_rename(connection_struct *conn, files_struct *fsp,
                return NT_STATUS_OK;
        }
 
-       if (fsp->access_mask & DELETE_ACCESS) {
+       if (fsp->access_mask & (DELETE_ACCESS|FILE_WRITE_ATTRIBUTES)) {
                return NT_STATUS_OK;
        }
 
@@ -5585,7 +5585,8 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
                        uint32 attrs,
                        bool replace_if_exists,
                        bool src_has_wild,
-                       bool dest_has_wild)
+                       bool dest_has_wild,
+                       uint32_t access_mask)
 {
        char *directory = NULL;
        char *mask = NULL;
@@ -5715,12 +5716,12 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 
                status = S_ISDIR(sbuf1.st_mode) ?
                        open_directory(conn, req, directory, &sbuf1,
-                                      DELETE_ACCESS,
+                                      access_mask,
                                       FILE_SHARE_READ|FILE_SHARE_WRITE,
                                       FILE_OPEN, 0, 0, NULL,
                                       &fsp)
                        : open_file_ntcreate(conn, req, directory, &sbuf1,
-                                            DELETE_ACCESS,
+                                            access_mask,
                                             FILE_SHARE_READ|FILE_SHARE_WRITE,
                                             FILE_OPEN, 0, 0, 0, NULL,
                                             &fsp);
@@ -5819,12 +5820,12 @@ NTSTATUS rename_internals(TALLOC_CTX *ctx,
 
                status = S_ISDIR(sbuf1.st_mode) ?
                        open_directory(conn, req, fname, &sbuf1,
-                                      DELETE_ACCESS,
+                                      access_mask,
                                       FILE_SHARE_READ|FILE_SHARE_WRITE,
                                       FILE_OPEN, 0, 0, NULL,
                                       &fsp)
                        : open_file_ntcreate(conn, req, fname, &sbuf1,
-                                            DELETE_ACCESS,
+                                            access_mask,
                                             FILE_SHARE_READ|FILE_SHARE_WRITE,
                                             FILE_OPEN, 0, 0, 0, NULL,
                                             &fsp);
@@ -5947,7 +5948,7 @@ void reply_mv(struct smb_request *req)
        DEBUG(3,("reply_mv : %s -> %s\n",name,newname));
 
        status = rename_internals(ctx, conn, req, name, newname, attrs, False,
-                                 src_has_wcard, dest_has_wcard);
+                                 src_has_wcard, dest_has_wcard, DELETE_ACCESS);
        if (!NT_STATUS_IS_OK(status)) {
                if (open_was_deferred(req->mid)) {
                        /* We have re-scheduled this call. */
index 716f94f661cc03fd59c73ffb329a24cdf57ccafe..85a7cdb613251d35d346fcac770f6865e5b84a51 100644 (file)
@@ -5322,7 +5322,8 @@ static NTSTATUS smb_file_rename_information(connection_struct *conn,
                DEBUG(10,("smb_file_rename_information: SMB_FILE_RENAME_INFORMATION %s -> %s\n",
                        fname, base_name ));
                status = rename_internals(ctx, conn, req, fname, base_name, 0,
-                                         overwrite, False, dest_has_wcard);
+                                       overwrite, False, dest_has_wcard,
+                                       FILE_WRITE_ATTRIBUTES);
        }
 
        return status;