mirror of
https://github.com/samba-team/samba.git
synced 2025-01-11 05:18:09 +03:00
Remove unneeded argument from can_set_delete_on_close(). Ensure
can_set_delete_on_close() is correctly called before any setting of the disposition bit (clean up the do_unlink() call). Jeremy.
This commit is contained in:
parent
76be0f6a11
commit
dfcc4115dd
@ -3499,8 +3499,7 @@ bool del_share_mode(struct share_mode_lock *lck, files_struct *fsp);
|
||||
void del_deferred_open_entry(struct share_mode_lock *lck, uint16 mid);
|
||||
bool remove_share_oplock(struct share_mode_lock *lck, files_struct *fsp);
|
||||
bool downgrade_share_oplock(struct share_mode_lock *lck, files_struct *fsp);
|
||||
NTSTATUS can_set_delete_on_close(files_struct *fsp, bool delete_on_close,
|
||||
uint32 dosmode);
|
||||
NTSTATUS can_set_delete_on_close(files_struct *fsp, uint32 dosmode);
|
||||
void set_delete_on_close_token(struct share_mode_lock *lck, const UNIX_USER_TOKEN *tok);
|
||||
void set_delete_on_close_lck(struct share_mode_lock *lck, bool delete_on_close, const UNIX_USER_TOKEN *tok);
|
||||
bool set_delete_on_close(files_struct *fsp, bool delete_on_close, const UNIX_USER_TOKEN *tok);
|
||||
|
@ -1307,18 +1307,11 @@ bool downgrade_share_oplock(struct share_mode_lock *lck, files_struct *fsp)
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Deal with the internal needs of setting the delete on close flag. Note that
|
||||
as the tdb locking is recursive, it is safe to call this from within
|
||||
open_file_ntcreate. JRA.
|
||||
Check if setting delete on close is allowed on this fsp.
|
||||
****************************************************************************/
|
||||
|
||||
NTSTATUS can_set_delete_on_close(files_struct *fsp, bool delete_on_close,
|
||||
uint32 dosmode)
|
||||
NTSTATUS can_set_delete_on_close(files_struct *fsp, uint32 dosmode)
|
||||
{
|
||||
if (!delete_on_close) {
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Only allow delete on close for writable files.
|
||||
*/
|
||||
|
@ -1328,7 +1328,7 @@ NTSTATUS onefs_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. */
|
||||
@ -1686,7 +1686,7 @@ static NTSTATUS onefs_open_directory(connection_struct *conn,
|
||||
* 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);
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user