From 9d017bd09cf60644db45802bb2e5fd5ffaed619a Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Sun, 29 Jul 2007 15:57:41 +0000 Subject: * 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. --- winsup/cygwin/fhandler_disk_file.cc | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'winsup/cygwin/fhandler_disk_file.cc') diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index 07e499e67..46b178fb7 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -776,7 +776,7 @@ fhandler_disk_file::fchmod (mode_t mode) FILE_BASIC_INFORMATION fbi; fbi.CreationTime.QuadPart = fbi.LastAccessTime.QuadPart = 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, FileBasicInformation); if (!NT_SUCCESS (status)) @@ -914,8 +914,9 @@ fhandler_disk_file::facl (int cmd, int nentries, __aclent32_t *aclbufp) = fbi.LastAccessTime.QuadPart = fbi.LastWriteTime.QuadPart = fbi.ChangeTime.QuadPart = 0LL; - fbi.FileAttributes = pc.file_attributes () - & ~FILE_ATTRIBUTE_READONLY; + fbi.FileAttributes = (pc.file_attributes () + & ~FILE_ATTRIBUTE_READONLY) + ?: FILE_ATTRIBUTE_NORMAL; NtSetInformationFile (get_handle (), &io, &fbi, sizeof fbi, FileBasicInformation); } @@ -1124,6 +1125,10 @@ fhandler_disk_file::link (const char *newpath) __seterrno (); return -1; } + if (!allow_winsymlinks && pc.is_lnk_special ()) + SetFileAttributesW (newpcw, pc.file_attributes () + | FILE_ATTRIBUTE_SYSTEM + | FILE_ATTRIBUTE_READONLY); } else { @@ -1131,10 +1136,6 @@ fhandler_disk_file::link (const char *newpath) return -1; } } - if (!allow_winsymlinks && pc.is_lnk_special ()) - SetFileAttributes (newpc, (DWORD) pc - | FILE_ATTRIBUTE_SYSTEM - | FILE_ATTRIBUTE_READONLY); return 0; } -- cgit v1.2.3