s3: smbd: SMB2 close. If a file has delete on close, store the return info before...
authorJeremy Allison <jra@samba.org>
Fri, 20 Feb 2015 02:50:45 +0000 (18:50 -0800)
committerJeremy Allison <jra@samba.org>
Fri, 20 Feb 2015 19:54:18 +0000 (20:54 +0100)
If we delete the file on close, the stat after the close
will fail so we fail to return the attributes requested.

Bug 11104 - SMB2/SMB3 close response does not include attributes when requested.

https://bugzilla.samba.org/show_bug.cgi?id=11104

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Steve French <sfrench@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Fri Feb 20 20:54:18 CET 2015 on sn-devel-104

source3/smbd/smb2_close.c

index 755a4b69f34d236bd1eb79b42061d9f452db6974..ed53e1be0a7421cd11f4a23d93d6bda12b38e4c1 100644 (file)
@@ -237,6 +237,26 @@ static NTSTATUS smbd_smb2_close(struct smbd_smb2_request *req,
                return NT_STATUS_NO_MEMORY;
        }
 
+       if ((in_flags & SMB2_CLOSE_FLAGS_FULL_INFORMATION) &&
+           (fsp->initial_delete_on_close || fsp->delete_on_close)) {
+               /*
+                * We might be deleting the file. Ensure we
+                * return valid data from before the file got
+                * removed.
+                */
+               setup_close_full_information(conn,
+                               smb_fname,
+                               posix_open,
+                               out_creation_ts,
+                               out_last_access_ts,
+                               out_last_write_ts,
+                               out_change_ts,
+                               &flags,
+                               &allocation_size,
+                               &file_size,
+                               &dos_attrs);
+       }
+
        status = close_file(smbreq, fsp, NORMAL_CLOSE);
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(5,("smbd_smb2_close: close_file[%s]: %s\n",