* 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:
Corinna Vinschen 2007-07-29 15:57:41 +00:00
parent ed7ec849f6
commit 9d017bd09c
3 changed files with 38 additions and 19 deletions

View File

@ -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.

View File

@ -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;
} }

View File

@ -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;