diff options
author | Jeremy Allison <jra@samba.org> | 2004-10-16 03:04:40 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2004-10-16 03:04:40 +0000 |
commit | 06b491f02e614d3d4dd569a09d5846b094063a32 (patch) | |
tree | 7b2e7e5153ca7aeba944ce6b74e63fbff4cd1a93 /source/smbd/open.c | |
parent | 470e5b01cb7d57d618822f776a0de8f713f665fb (diff) | |
download | samba-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.c | 16 |
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); |