Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2010-09-15 15:26:10 +0400
committerCorinna Vinschen <corinna@vinschen.de>2010-09-15 15:26:10 +0400
commit421ff3ff77d3f6fb07a849e11b7e0268172b6e17 (patch)
tree7a78585f9ca5187e1f2dfeace45d8cab74646ac2 /winsup
parentf859880a5b4a090901fffd05a7b6fc55b6d3738f (diff)
* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Fetch number
of links and inode number only if path has good inodes. (fhandler_base::fstat_by_name): Fetch inode number only if path has good inodes.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/fhandler_disk_file.cc34
2 files changed, 27 insertions, 14 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 01ffad067..6a07da9d4 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,10 @@
+2010-09-15 Corinna Vinschen <corinna@vinschen.de>
+
+ * fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Fetch number
+ of links and inode number only if path has good inodes.
+ (fhandler_base::fstat_by_name): Fetch inode number only if path has
+ good inodes.
+
2010-09-14 Corinna Vinschen <corinna@vinschen.de>
* path.cc (symlink_info::check): Make sure AllocationSize and EndOfFile
diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc
index b9c62b27a..02376f6a5 100644
--- a/winsup/cygwin/fhandler_disk_file.cc
+++ b/winsup/cygwin/fhandler_disk_file.cc
@@ -356,25 +356,30 @@ fhandler_base::fstat_by_handle (struct __stat64 *buf)
NTSTATUS status = 0;
IO_STATUS_BLOCK io;
- status = NtQueryInformationFile (h, &io, &fsi, sizeof fsi,
- FileStandardInformation);
- if (!NT_SUCCESS (status))
- {
- debug_printf ("%p = NtQueryInformationFile(%S, FileStandardInformation)",
- status, pc.get_nt_native_path ());
- return -1;
- }
- if (!ino && pc.hasgood_inode ())
+ if (!pc.hasgood_inode ())
+ fsi.NumberOfLinks = 1;
+ else
{
- status = NtQueryInformationFile (h, &io, &fii, sizeof fii,
- FileInternalInformation);
+ status = NtQueryInformationFile (h, &io, &fsi, sizeof fsi,
+ FileStandardInformation);
if (!NT_SUCCESS (status))
{
- debug_printf ("%p = NtQueryInformationFile(%S, FileInternalInformation)",
+ debug_printf ("%p = NtQueryInformationFile(%S, FileStandardInformation)",
status, pc.get_nt_native_path ());
return -1;
}
- ino = fii.FileId.QuadPart;
+ if (!ino)
+ {
+ status = NtQueryInformationFile (h, &io, &fii, sizeof fii,
+ FileInternalInformation);
+ if (!NT_SUCCESS (status))
+ {
+ debug_printf ("%p = NtQueryInformationFile(%S, FileInternalInformation)",
+ status, pc.get_nt_native_path ());
+ return -1;
+ }
+ ino = fii.FileId.QuadPart;
+ }
}
return fstat_helper (buf, fsi.NumberOfLinks);
}
@@ -393,7 +398,8 @@ fhandler_base::fstat_by_name (struct __stat64 *buf)
WCHAR buf[NAME_MAX + 1];
} fdi_buf;
- if (!ino && wincap.has_fileid_dirinfo () && !pc.has_buggy_fileid_dirinfo ())
+ if (!ino && pc.hasgood_inode ()
+ && wincap.has_fileid_dirinfo () && !pc.has_buggy_fileid_dirinfo ())
{
RtlSplitUnicodePath (pc.get_nt_native_path (), &dirname, &basename);
InitializeObjectAttributes (&attr, &dirname, pc.objcaseinsensitive (),