Cygwin: Move post-dir unlink check
Move post-dir unlink check from fhandler_disk_file::rmdir to _unlink_nt_post_dir_check If a directory is not removed through fhandler_disk_file::rmdir we can now make sure the post dir check is performed.
This commit is contained in:
parent
a533334581
commit
0c0ff5dc21
|
@ -1852,26 +1852,6 @@ fhandler_disk_file::rmdir ()
|
||||||
|
|
||||||
NTSTATUS status = unlink_nt (pc);
|
NTSTATUS status = unlink_nt (pc);
|
||||||
|
|
||||||
/* Check for existence of remote dirs after trying to delete them.
|
|
||||||
Two reasons:
|
|
||||||
- Sometimes SMB indicates failure when it really succeeds.
|
|
||||||
- Removing a directory on a Samba drive using an old Samba version
|
|
||||||
sometimes doesn't return an error, if the directory can't be removed
|
|
||||||
because it's not empty. */
|
|
||||||
if (isremote ())
|
|
||||||
{
|
|
||||||
OBJECT_ATTRIBUTES attr;
|
|
||||||
FILE_BASIC_INFORMATION fbi;
|
|
||||||
NTSTATUS q_status;
|
|
||||||
|
|
||||||
q_status = NtQueryAttributesFile (pc.get_object_attr (attr, sec_none_nih),
|
|
||||||
&fbi);
|
|
||||||
if (!NT_SUCCESS (status) && q_status == STATUS_OBJECT_NAME_NOT_FOUND)
|
|
||||||
status = STATUS_SUCCESS;
|
|
||||||
else if (pc.fs_is_samba ()
|
|
||||||
&& NT_SUCCESS (status) && NT_SUCCESS (q_status))
|
|
||||||
status = STATUS_DIRECTORY_NOT_EMPTY;
|
|
||||||
}
|
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
__seterrno_from_nt_status (status);
|
__seterrno_from_nt_status (status);
|
||||||
|
|
|
@ -670,6 +670,30 @@ check_dir_not_empty (HANDLE dir, path_conv &pc)
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline NTSTATUS
|
||||||
|
_unlink_nt_post_dir_check (NTSTATUS status, POBJECT_ATTRIBUTES attr, const path_conv &pc)
|
||||||
|
{
|
||||||
|
/* Check for existence of remote dirs after trying to delete them.
|
||||||
|
Two reasons:
|
||||||
|
- Sometimes SMB indicates failure when it really succeeds.
|
||||||
|
- Removing a directory on a Samba drive using an old Samba version
|
||||||
|
sometimes doesn't return an error, if the directory can't be removed
|
||||||
|
because it's not empty. */
|
||||||
|
if (pc.isremote ())
|
||||||
|
{
|
||||||
|
FILE_BASIC_INFORMATION fbi;
|
||||||
|
NTSTATUS q_status;
|
||||||
|
|
||||||
|
q_status = NtQueryAttributesFile (attr, &fbi);
|
||||||
|
if (!NT_SUCCESS (status) && q_status == STATUS_OBJECT_NAME_NOT_FOUND)
|
||||||
|
status = STATUS_SUCCESS;
|
||||||
|
else if (pc.fs_is_samba ()
|
||||||
|
&& NT_SUCCESS (status) && NT_SUCCESS (q_status))
|
||||||
|
status = STATUS_DIRECTORY_NOT_EMPTY;
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
static NTSTATUS
|
static NTSTATUS
|
||||||
_unlink_nt (path_conv &pc, bool shareable)
|
_unlink_nt (path_conv &pc, bool shareable)
|
||||||
{
|
{
|
||||||
|
@ -1059,6 +1083,10 @@ out:
|
||||||
/* Stop transaction if we started one. */
|
/* Stop transaction if we started one. */
|
||||||
if (trans)
|
if (trans)
|
||||||
stop_transaction (status, old_trans, trans);
|
stop_transaction (status, old_trans, trans);
|
||||||
|
|
||||||
|
if (pc.isdir ())
|
||||||
|
status = _unlink_nt_post_dir_check (status, &attr, pc);
|
||||||
|
|
||||||
syscall_printf ("%S, return status = %y", pc.get_nt_native_path (), status);
|
syscall_printf ("%S, return status = %y", pc.get_nt_native_path (), status);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue