diff options
Diffstat (limited to 'source3/smbd')
-rw-r--r-- | source3/smbd/open.c | 4 | ||||
-rw-r--r-- | source3/smbd/reply.c | 30 | ||||
-rw-r--r-- | source3/smbd/trans2.c | 9 |
3 files changed, 18 insertions, 25 deletions
diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 72f6a00818..fd3c6103e9 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -2171,7 +2171,7 @@ static NTSTATUS open_file_ntcreate(connection_struct *conn, /* Handle strange delete on close create semantics. */ if (create_options & FILE_DELETE_ON_CLOSE) { - status = can_set_delete_on_close(fsp, True, new_dos_attributes); + status = can_set_delete_on_close(fsp, new_dos_attributes); if (!NT_STATUS_IS_OK(status)) { /* Remember to delete the mode we just added. */ @@ -2634,7 +2634,7 @@ static NTSTATUS open_directory(connection_struct *conn, /* For directories the delete on close bit at open time seems always to be honored on close... See test 19 in Samba4 BASE-DELETE. */ if (create_options & FILE_DELETE_ON_CLOSE) { - status = can_set_delete_on_close(fsp, True, 0); + status = can_set_delete_on_close(fsp, 0); if (!NT_STATUS_IS_OK(status) && !NT_STATUS_EQUAL(status, NT_STATUS_DIRECTORY_NOT_EMPTY)) { TALLOC_FREE(lck); file_free(req, fsp); diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index 682f56ff33..101635fb50 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -2454,24 +2454,6 @@ static NTSTATUS do_unlink(connection_struct *conn, return NT_STATUS_OBJECT_NAME_INVALID; #endif /* JRATEST */ - /* Fix for bug #3035 from SATOH Fumiyasu <fumiyas@miraclelinux.com> - - On a Windows share, a file with read-only dosmode can be opened with - DELETE_ACCESS. But on a Samba share (delete readonly = no), it - fails with NT_STATUS_CANNOT_DELETE error. - - This semantic causes a problem that a user can not - rename a file with read-only dosmode on a Samba share - from a Windows command prompt (i.e. cmd.exe, but can rename - from Windows Explorer). - */ - - if (!lp_delete_readonly(SNUM(conn))) { - if (fattr & aRONLY) { - return NT_STATUS_CANNOT_DELETE; - } - } - /* On open checks the open itself will check the share mode, so don't do it here as we'll get it wrong. */ @@ -2500,6 +2482,16 @@ static NTSTATUS do_unlink(connection_struct *conn, return status; } + status = can_set_delete_on_close(fsp, fattr); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(10, ("do_unlink can_set_delete_on_close for file %s - " + "(%s)\n", + smb_fname_str_dbg(smb_fname), + nt_errstr(status))); + close_file(req, fsp, NORMAL_CLOSE); + return status; + } + /* The set is across all open files on this dev/inode pair. */ if (!set_delete_on_close(fsp, True, &conn->server_info->utok)) { close_file(req, fsp, NORMAL_CLOSE); @@ -6084,7 +6076,7 @@ NTSTATUS rename_internals_fsp(connection_struct *conn, */ if (create_options & FILE_DELETE_ON_CLOSE) { - status = can_set_delete_on_close(fsp, True, 0); + status = can_set_delete_on_close(fsp, 0); if (NT_STATUS_IS_OK(status)) { /* Note that here we set the *inital* delete on close flag, diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 9c69b3bf2c..cd4f605c39 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -5737,10 +5737,11 @@ static NTSTATUS smb_set_file_disposition_info(connection_struct *conn, (unsigned int)dosmode, (unsigned int)delete_on_close )); - status = can_set_delete_on_close(fsp, delete_on_close, dosmode); - - if (!NT_STATUS_IS_OK(status)) { - return status; + if (delete_on_close) { + status = can_set_delete_on_close(fsp, dosmode); + if (!NT_STATUS_IS_OK(status)) { + return status; + } } /* The set is across all open files on this dev/inode pair. */ |