* fhandler_disk_file.cc (fhandler_disk_file::fchmod): Don't allow
FileAttributes set to 0 when calling NtSetInformationFile since it has a special meaning. (fhandler_disk_file::facl): Ditto. (fhandler_disk_file::link): Only set attributes after copying files. Use SetFileAttributesW. * syscalls.cc (unlink_nt): Only care for actual FILE_ATTRIBUTE_READONLY. Don't allow FileAttributes set to 0 when calling NtSetInformationFile. After marking for deletion, restore R/O attribute on files to accommodate hardlinks.
This commit is contained in:
parent
ed7ec849f6
commit
9d017bd09c
|
@ -1,3 +1,16 @@
|
||||||
|
2007-07-29 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* fhandler_disk_file.cc (fhandler_disk_file::fchmod): Don't allow
|
||||||
|
FileAttributes set to 0 when calling NtSetInformationFile since it has
|
||||||
|
a special meaning.
|
||||||
|
(fhandler_disk_file::facl): Ditto.
|
||||||
|
(fhandler_disk_file::link): Only set attributes after copying files.
|
||||||
|
Use SetFileAttributesW.
|
||||||
|
* syscalls.cc (unlink_nt): Only care for actual FILE_ATTRIBUTE_READONLY.
|
||||||
|
Don't allow FileAttributes set to 0 when calling NtSetInformationFile.
|
||||||
|
After marking for deletion, restore R/O attribute on files to
|
||||||
|
accommodate hardlinks.
|
||||||
|
|
||||||
2007-07-29 Corinna Vinschen <corinna@vinschen.de>
|
2007-07-29 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* fhandler_disk_file.cc (fhandler_disk_file::link): Use FILE_ANY_ACCESS.
|
* fhandler_disk_file.cc (fhandler_disk_file::link): Use FILE_ANY_ACCESS.
|
||||||
|
|
|
@ -776,7 +776,7 @@ fhandler_disk_file::fchmod (mode_t mode)
|
||||||
FILE_BASIC_INFORMATION fbi;
|
FILE_BASIC_INFORMATION fbi;
|
||||||
fbi.CreationTime.QuadPart = fbi.LastAccessTime.QuadPart
|
fbi.CreationTime.QuadPart = fbi.LastAccessTime.QuadPart
|
||||||
= fbi.LastWriteTime.QuadPart = fbi.ChangeTime.QuadPart = 0LL;
|
= fbi.LastWriteTime.QuadPart = fbi.ChangeTime.QuadPart = 0LL;
|
||||||
fbi.FileAttributes = pc.file_attributes ();
|
fbi.FileAttributes = pc.file_attributes () ?: FILE_ATTRIBUTE_NORMAL;
|
||||||
NTSTATUS status = NtSetInformationFile (get_handle (), &io, &fbi, sizeof fbi,
|
NTSTATUS status = NtSetInformationFile (get_handle (), &io, &fbi, sizeof fbi,
|
||||||
FileBasicInformation);
|
FileBasicInformation);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
|
@ -914,8 +914,9 @@ fhandler_disk_file::facl (int cmd, int nentries, __aclent32_t *aclbufp)
|
||||||
= fbi.LastAccessTime.QuadPart
|
= fbi.LastAccessTime.QuadPart
|
||||||
= fbi.LastWriteTime.QuadPart
|
= fbi.LastWriteTime.QuadPart
|
||||||
= fbi.ChangeTime.QuadPart = 0LL;
|
= fbi.ChangeTime.QuadPart = 0LL;
|
||||||
fbi.FileAttributes = pc.file_attributes ()
|
fbi.FileAttributes = (pc.file_attributes ()
|
||||||
& ~FILE_ATTRIBUTE_READONLY;
|
& ~FILE_ATTRIBUTE_READONLY)
|
||||||
|
?: FILE_ATTRIBUTE_NORMAL;
|
||||||
NtSetInformationFile (get_handle (), &io, &fbi, sizeof fbi,
|
NtSetInformationFile (get_handle (), &io, &fbi, sizeof fbi,
|
||||||
FileBasicInformation);
|
FileBasicInformation);
|
||||||
}
|
}
|
||||||
|
@ -1124,6 +1125,10 @@ fhandler_disk_file::link (const char *newpath)
|
||||||
__seterrno ();
|
__seterrno ();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (!allow_winsymlinks && pc.is_lnk_special ())
|
||||||
|
SetFileAttributesW (newpcw, pc.file_attributes ()
|
||||||
|
| FILE_ATTRIBUTE_SYSTEM
|
||||||
|
| FILE_ATTRIBUTE_READONLY);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1131,10 +1136,6 @@ fhandler_disk_file::link (const char *newpath)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!allow_winsymlinks && pc.is_lnk_special ())
|
|
||||||
SetFileAttributes (newpc, (DWORD) pc
|
|
||||||
| FILE_ATTRIBUTE_SYSTEM
|
|
||||||
| FILE_ATTRIBUTE_READONLY);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -238,12 +238,10 @@ unlink_nt (path_conv &pc)
|
||||||
FILE_BASIC_INFORMATION fbi;
|
FILE_BASIC_INFORMATION fbi;
|
||||||
|
|
||||||
ACCESS_MASK access = DELETE;
|
ACCESS_MASK access = DELETE;
|
||||||
/* If one of the R/O attributes is set, we have to open the file with
|
/* If the R/O attribute is set, we have to open the file with
|
||||||
FILE_WRITE_ATTRIBUTES to be able to remove these flags before trying
|
FILE_WRITE_ATTRIBUTES to be able to remove this flags before trying
|
||||||
to delete it. */
|
to delete it. */
|
||||||
if (pc.file_attributes () & (FILE_ATTRIBUTE_READONLY
|
if (pc.file_attributes () & FILE_ATTRIBUTE_READONLY)
|
||||||
| FILE_ATTRIBUTE_SYSTEM
|
|
||||||
| FILE_ATTRIBUTE_HIDDEN))
|
|
||||||
access |= FILE_WRITE_ATTRIBUTES;
|
access |= FILE_WRITE_ATTRIBUTES;
|
||||||
|
|
||||||
ULONG flags = FILE_OPEN_FOR_BACKUP_INTENT;
|
ULONG flags = FILE_OPEN_FOR_BACKUP_INTENT;
|
||||||
|
@ -330,16 +328,14 @@ unlink_nt (path_conv &pc)
|
||||||
if (move_to_bin && !pc.isremote ())
|
if (move_to_bin && !pc.isremote ())
|
||||||
try_to_bin (pc, fh);
|
try_to_bin (pc, fh);
|
||||||
|
|
||||||
/* Get rid of read-only attributes. */
|
/* Get rid of read-only attribute. */
|
||||||
if (access & FILE_WRITE_ATTRIBUTES)
|
if (access & FILE_WRITE_ATTRIBUTES)
|
||||||
{
|
{
|
||||||
FILE_BASIC_INFORMATION fbi;
|
FILE_BASIC_INFORMATION fbi;
|
||||||
fbi.CreationTime.QuadPart = fbi.LastAccessTime.QuadPart =
|
fbi.CreationTime.QuadPart = fbi.LastAccessTime.QuadPart =
|
||||||
fbi.LastWriteTime.QuadPart = fbi.ChangeTime.QuadPart = 0LL;
|
fbi.LastWriteTime.QuadPart = fbi.ChangeTime.QuadPart = 0LL;
|
||||||
fbi.FileAttributes = pc.file_attributes ()
|
fbi.FileAttributes = (pc.file_attributes () & ~FILE_ATTRIBUTE_READONLY)
|
||||||
& ~(FILE_ATTRIBUTE_READONLY
|
?: FILE_ATTRIBUTE_NORMAL;
|
||||||
| FILE_ATTRIBUTE_SYSTEM
|
|
||||||
| FILE_ATTRIBUTE_HIDDEN);
|
|
||||||
NtSetInformationFile (fh, &io, &fbi, sizeof fbi, FileBasicInformation);
|
NtSetInformationFile (fh, &io, &fbi, sizeof fbi, FileBasicInformation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,14 +345,23 @@ unlink_nt (path_conv &pc)
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
syscall_printf ("Setting delete disposition failed, status = %p", status);
|
syscall_printf ("Setting delete disposition failed, status = %p", status);
|
||||||
/* Restore R/O attributes. */
|
|
||||||
if (access & FILE_WRITE_ATTRIBUTES)
|
if (access & FILE_WRITE_ATTRIBUTES)
|
||||||
{
|
{
|
||||||
|
/* Restore R/O attributes. */
|
||||||
fbi.FileAttributes = pc.file_attributes ();
|
fbi.FileAttributes = pc.file_attributes ();
|
||||||
NtSetInformationFile (fh, &io, &fbi, sizeof fbi,
|
NtSetInformationFile (fh, &io, &fbi, sizeof fbi,
|
||||||
FileBasicInformation);
|
FileBasicInformation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if ((access & FILE_WRITE_ATTRIBUTES) && !pc.isdir ())
|
||||||
|
{
|
||||||
|
/* Restore R/O attribute to accommodate hardlinks. Don't try this
|
||||||
|
with directories! For some reason the below NtSetInformationFile
|
||||||
|
changes the disposition for delete back to FALSE, at least on XP. */
|
||||||
|
fbi.FileAttributes = pc.file_attributes ();
|
||||||
|
NtSetInformationFile (fh, &io, &fbi, sizeof fbi,
|
||||||
|
FileBasicInformation);
|
||||||
|
}
|
||||||
|
|
||||||
NtClose (fh);
|
NtClose (fh);
|
||||||
return status;
|
return status;
|
||||||
|
|
Loading…
Reference in New Issue