diff -urN samba-3.0.23d/source/printing/nt_printing.c samba/source/printing/nt_printing.c --- samba-3.0.23d/source/printing/nt_printing.c 2006-07-10 11:27:50.000000000 -0500 +++ samba/source/printing/nt_printing.c 2007-01-30 15:00:45.000000000 -0600 @@ -4839,7 +4839,7 @@ pstrcpy( file, s ); driver_unix_convert(file, conn, NULL, &bad_path, &st); DEBUG(10,("deleting driverfile [%s]\n", s)); - unlink_internals(conn, 0, file, False); + unlink_internals(conn, 0, file, False, False); } } @@ -4848,7 +4848,7 @@ pstrcpy( file, s ); driver_unix_convert(file, conn, NULL, &bad_path, &st); DEBUG(10,("deleting configfile [%s]\n", s)); - unlink_internals(conn, 0, file, False); + unlink_internals(conn, 0, file, False, False); } } @@ -4857,7 +4857,7 @@ pstrcpy( file, s ); driver_unix_convert(file, conn, NULL, &bad_path, &st); DEBUG(10,("deleting datafile [%s]\n", s)); - unlink_internals(conn, 0, file, False); + unlink_internals(conn, 0, file, False, False); } } @@ -4866,7 +4866,7 @@ pstrcpy( file, s ); driver_unix_convert(file, conn, NULL, &bad_path, &st); DEBUG(10,("deleting helpfile [%s]\n", s)); - unlink_internals(conn, 0, file, False); + unlink_internals(conn, 0, file, False, False); } } @@ -4882,7 +4882,7 @@ pstrcpy( file, p ); driver_unix_convert(file, conn, NULL, &bad_path, &st); DEBUG(10,("deleting dependent file [%s]\n", file)); - unlink_internals(conn, 0, file, False); + unlink_internals(conn, 0, file, False, False); } i++; diff -urN samba-3.0.23d/source/smbd/nttrans.c samba/source/smbd/nttrans.c --- samba-3.0.23d/source/smbd/nttrans.c 2006-06-23 08:16:49.000000000 -0500 +++ samba/source/smbd/nttrans.c 2007-01-30 15:00:45.000000000 -0600 @@ -664,7 +664,7 @@ if (lp_acl_check_permissions(SNUM(conn)) && (share_access & FILE_SHARE_DELETE) && (access_mask & DELETE_ACCESS)) { #endif - status = can_delete(conn, fname, file_attributes, bad_path, True); + status = can_delete(conn, fname, file_attributes, bad_path, True, False); /* We're only going to fail here if it's access denied, as that's the only error we care about for "can we delete this ?" questions. */ if (!NT_STATUS_IS_OK(status) && (NT_STATUS_EQUAL(status,NT_STATUS_ACCESS_DENIED) || @@ -1281,7 +1281,7 @@ /* Setting FILE_SHARE_DELETE is the hint. */ if (lp_acl_check_permissions(SNUM(conn)) && (share_access & FILE_SHARE_DELETE) && (access_mask & DELETE_ACCESS)) { #endif - status = can_delete(conn, fname, file_attributes, bad_path, True); + status = can_delete(conn, fname, file_attributes, bad_path, True, False); /* We're only going to fail here if it's access denied, as that's the only error we care about for "can we delete this ?" questions. */ if (!NT_STATUS_IS_OK(status) && (NT_STATUS_EQUAL(status,NT_STATUS_ACCESS_DENIED) || @@ -1888,8 +1888,14 @@ status = rename_internals(conn, fsp->fsp_name, new_name, 0, replace_if_exists, path_contains_wcard); - if (!NT_STATUS_IS_OK(status)) + + if (!NT_STATUS_IS_OK(status)) { + if (open_was_deferred(SVAL(inbuf,smb_mid))) { + /* We have re-scheduled this call. */ + return -1; + } return ERROR_NT(status); + } /* * Rename was successful. diff -urN samba-3.0.23d/source/smbd/reply.c samba/source/smbd/reply.c --- samba-3.0.23d/source/smbd/reply.c 2006-06-23 08:16:49.000000000 -0500 +++ samba/source/smbd/reply.c 2007-01-30 15:00:45.000000000 -0600 @@ -1865,7 +1865,7 @@ Check if a user is allowed to delete a file. ********************************************************************/ -NTSTATUS can_delete(connection_struct *conn, char *fname, uint32 dirtype, BOOL bad_path, BOOL check_is_at_open) +NTSTATUS can_delete(connection_struct *conn, char *fname, uint32 dirtype, BOOL bad_path, BOOL check_is_at_open, BOOL can_defer) { SMB_STRUCT_STAT sbuf; uint32 fattr; @@ -1938,7 +1938,7 @@ FILE_OPEN, 0, FILE_ATTRIBUTE_NORMAL, - 0, + can_defer ? 0 : INTERNAL_OPEN_ONLY, NULL); if (!fsp) { @@ -1960,7 +1960,7 @@ code. ****************************************************************************/ -NTSTATUS unlink_internals(connection_struct *conn, uint32 dirtype, char *name, BOOL has_wild) +NTSTATUS unlink_internals(connection_struct *conn, uint32 dirtype, char *name, BOOL has_wild, BOOL can_defer) { pstring directory; pstring mask; @@ -2000,7 +2000,7 @@ if (!has_wild) { pstrcat(directory,"/"); pstrcat(directory,mask); - error = can_delete(conn,directory,dirtype,bad_path,False); + error = can_delete(conn,directory,dirtype,bad_path,False,can_defer); if (!NT_STATUS_IS_OK(error)) return error; @@ -2058,7 +2058,7 @@ } slprintf(fname,sizeof(fname)-1, "%s/%s",directory,dname); - error = can_delete(conn,fname,dirtype,bad_path,False); + error = can_delete(conn,fname,dirtype,bad_path,False,False); if (!NT_STATUS_IS_OK(error)) { continue; } @@ -2104,7 +2104,7 @@ DEBUG(3,("reply_unlink : %s\n",name)); - status = unlink_internals(conn, dirtype, name, path_contains_wcard); + status = unlink_internals(conn, dirtype, name, path_contains_wcard, True); if (!NT_STATUS_IS_OK(status)) { if (open_was_deferred(SVAL(inbuf,smb_mid))) { /* We have re-scheduled this call. */ diff -urN samba-3.0.23d/source/smbd/trans2.c samba/source/smbd/trans2.c --- samba-3.0.23d/source/smbd/trans2.c 2006-11-14 08:42:12.000000000 -0600 +++ samba/source/smbd/trans2.c 2007-01-30 15:00:35.000000000 -0600 @@ -4446,9 +4446,15 @@ fname, newname )); status = rename_internals(conn, fname, base_name, 0, overwrite, False); } + if (!NT_STATUS_IS_OK(status)) { + if (open_was_deferred(SVAL(inbuf,smb_mid))) { + /* We have re-scheduled this call. */ + return -1; + } return ERROR_NT(status); } + process_pending_change_notify_queue((time_t)0); SSVAL(params,0,0); send_trans2_replies(outbuf, bufsize, params, 2, *ppdata, 0);