From 421ff3ff77d3f6fb07a849e11b7e0268172b6e17 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 15 Sep 2010 11:26:10 +0000 Subject: * 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. --- winsup/cygwin/ChangeLog | 7 +++++++ winsup/cygwin/fhandler_disk_file.cc | 34 ++++++++++++++++++++-------------- 2 files changed, 27 insertions(+), 14 deletions(-) (limited to 'winsup') 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 + + * 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 * 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 (), -- cgit v1.2.3