OSDN Git Service

* fhandler_disk_file.cc (fhandler_base::fstat_by_handle): Fetch number
authorcorinna <corinna>
Wed, 15 Sep 2010 11:26:09 +0000 (11:26 +0000)
committercorinna <corinna>
Wed, 15 Sep 2010 11:26:09 +0000 (11:26 +0000)
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
winsup/cygwin/fhandler_disk_file.cc

index 01ffad0..6a07da9 100644 (file)
@@ -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
index b9c62b2..02376f6 100644 (file)
@@ -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 (),