mirror of
https://github.com/samba-team/samba.git
synced 2025-03-20 22:50:26 +03:00
r11344: I don't think share mode conflicts occur on deleting
a directory when you've got permissions. Need to write a smbtorture test for this. Jeremy. (This used to be commit e959a5be393eb59b8987eb6967a2ee5d11978f41)
This commit is contained in:
parent
533da83852
commit
c0dad16e0f
@ -300,8 +300,6 @@ static int close_directory(files_struct *fsp, BOOL normal_close)
|
||||
struct share_mode_lock *lck = 0;
|
||||
BOOL delete_dir = False;
|
||||
|
||||
remove_pending_change_notify_requests_by_fid(fsp);
|
||||
|
||||
/*
|
||||
* NT can set delete_on_close of the last open
|
||||
* reference to a directory also.
|
||||
@ -320,18 +318,7 @@ static int close_directory(files_struct *fsp, BOOL normal_close)
|
||||
|
||||
delete_dir = lck->delete_on_close;
|
||||
|
||||
if (delete_dir) {
|
||||
int i;
|
||||
/* See if others still have the file open. If this is the
|
||||
* case, then don't delete */
|
||||
for (i=0; i<lck->num_share_modes; i++) {
|
||||
if (is_valid_share_mode_entry(&lck->share_modes[i])) {
|
||||
delete_dir = False;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
talloc_free(lck);
|
||||
|
||||
if (normal_close && delete_dir) {
|
||||
BOOL ok = rmdir_internals(fsp->conn, fsp->fsp_name);
|
||||
@ -344,13 +331,15 @@ static int close_directory(files_struct *fsp, BOOL normal_close)
|
||||
*/
|
||||
|
||||
if(ok) {
|
||||
remove_pending_change_notify_requests_by_filename(fsp);
|
||||
remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_DELETE_PENDING);
|
||||
remove_pending_change_notify_requests_by_filename(fsp, NT_STATUS_DELETE_PENDING);
|
||||
|
||||
}
|
||||
process_pending_change_notify_queue((time_t)0);
|
||||
} else {
|
||||
remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_CANCELLED);
|
||||
}
|
||||
|
||||
talloc_free(lck);
|
||||
|
||||
/*
|
||||
* Do the code common to files and directories.
|
||||
*/
|
||||
|
@ -82,13 +82,14 @@ static void change_notify_remove(struct change_notify *cnbp)
|
||||
Delete entries by fnum from the change notify pending queue.
|
||||
*****************************************************************************/
|
||||
|
||||
void remove_pending_change_notify_requests_by_fid(files_struct *fsp)
|
||||
void remove_pending_change_notify_requests_by_fid(files_struct *fsp, NTSTATUS status)
|
||||
{
|
||||
struct change_notify *cnbp, *next;
|
||||
|
||||
for (cnbp=change_notify_list; cnbp; cnbp=next) {
|
||||
next=cnbp->next;
|
||||
if (cnbp->fsp->fnum == fsp->fnum) {
|
||||
change_notify_reply_packet(cnbp->request_buf,status);
|
||||
change_notify_remove(cnbp);
|
||||
}
|
||||
}
|
||||
@ -116,7 +117,7 @@ void remove_pending_change_notify_requests_by_mid(int mid)
|
||||
Always send reply.
|
||||
*****************************************************************************/
|
||||
|
||||
void remove_pending_change_notify_requests_by_filename(files_struct *fsp)
|
||||
void remove_pending_change_notify_requests_by_filename(files_struct *fsp, NTSTATUS status)
|
||||
{
|
||||
struct change_notify *cnbp, *next;
|
||||
|
||||
@ -127,7 +128,7 @@ void remove_pending_change_notify_requests_by_filename(files_struct *fsp)
|
||||
* the filename are identical.
|
||||
*/
|
||||
if((cnbp->fsp->conn == fsp->conn) && strequal(cnbp->fsp->fsp_name,fsp->fsp_name)) {
|
||||
change_notify_reply_packet(cnbp->request_buf,NT_STATUS_CANCELLED);
|
||||
change_notify_reply_packet(cnbp->request_buf,status);
|
||||
change_notify_remove(cnbp);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user