summaryrefslogtreecommitdiffstats
path: root/source/smbd/open.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2004-10-16 03:04:40 +0000
committerJeremy Allison <jra@samba.org>2004-10-16 03:04:40 +0000
commit06b491f02e614d3d4dd569a09d5846b094063a32 (patch)
tree7b2e7e5153ca7aeba944ce6b74e63fbff4cd1a93 /source/smbd/open.c
parent470e5b01cb7d57d618822f776a0de8f713f665fb (diff)
downloadsamba-06b491f02e614d3d4dd569a09d5846b094063a32.tar.gz
samba-06b491f02e614d3d4dd569a09d5846b094063a32.tar.xz
samba-06b491f02e614d3d4dd569a09d5846b094063a32.zip
r3002: Fix for bug #1886 - prevent delete on close being set
for readonly files (and return the correct error code). We now pass the Samba4 test suite on this. Jeremy.
Diffstat (limited to 'source/smbd/open.c')
-rw-r--r--source/smbd/open.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/source/smbd/open.c b/source/smbd/open.c
index 6d559ac8280..55970493fa1 100644
--- a/source/smbd/open.c
+++ b/source/smbd/open.c
@@ -1409,9 +1409,17 @@ flags=0x%X flags2=0x%X mode=0%o returned %d\n",
}
if (delete_on_close) {
- NTSTATUS result = set_delete_on_close_internal(fsp, delete_on_close);
+ uint32 dosmode = existing_dos_mode;
+ NTSTATUS result;
+
+ if (action == FILE_WAS_OVERWRITTEN || action == FILE_WAS_CREATED) {
+ dosmode = new_dos_mode;
+ }
+ result = set_delete_on_close_internal(fsp, delete_on_close, dosmode);
if (NT_STATUS_V(result) != NT_STATUS_V(NT_STATUS_OK)) {
+ uint8 u_e_c;
+ uint32 u_e_code;
/* Remember to delete the mode we just added. */
if (add_share_mode) {
del_share_mode(fsp, NULL);
@@ -1419,6 +1427,10 @@ flags=0x%X flags2=0x%X mode=0%o returned %d\n",
unlock_share_entry_fsp(fsp);
fd_close(conn,fsp);
file_free(fsp);
+ ntstatus_to_dos(result, &u_e_c, &u_e_code);
+ unix_ERR_ntstatus = result;
+ unix_ERR_class = u_e_c;
+ unix_ERR_code = u_e_code;
return NULL;
}
}
@@ -1651,7 +1663,7 @@ files_struct *open_directory(connection_struct *conn, char *fname, SMB_STRUCT_ST
string_set(&fsp->fsp_name,fname);
if (delete_on_close) {
- NTSTATUS result = set_delete_on_close_internal(fsp, delete_on_close);
+ NTSTATUS result = set_delete_on_close_internal(fsp, delete_on_close, 0);
if (NT_STATUS_V(result) != NT_STATUS_V(NT_STATUS_OK)) {
file_free(fsp);