From 5fe7c5e01b082d749eb8fc0f0afc3b6c3c0e068f Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Tue, 23 Nov 2010 09:26:16 +0000 Subject: [PATCH] * path.cc (symlink_info::check): Don't use FileNetworkOpenInformation on Netapps. Relax condition for workaround. Always request size information via FileStandardInformation info class in workaround. --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/path.cc | 33 +++++++++++++++++++++++---------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 9625363e4..80a35ef24 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,9 @@ +2010-11-23 Corinna Vinschen + + * path.cc (symlink_info::check): Don't use FileNetworkOpenInformation + on Netapps. Relax condition for workaround. Always request size + information via FileStandardInformation info class in workaround. + 2010-11-22 Corinna Vinschen * mount.cc (NETAPP_IGNORE): Add FILE_PERSISTENT_ACLS. diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index ebd613e4a..eb0fdbefb 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -2388,24 +2388,37 @@ restart: { PFILE_NETWORK_OPEN_INFORMATION pfnoi = conv_hdl.fnoi (); - status = NtQueryInformationFile (h, &io, pfnoi, sizeof *pfnoi, - FileNetworkOpenInformation); - if ((status == STATUS_INVALID_PARAMETER - || status == STATUS_NOT_IMPLEMENTED) - && RtlEqualUnicodePathPrefix (&upath, &ro_u_uncp, FALSE)) - { - /* This occurs when accessing SMB share root dirs hosted on - NT4 (STATUS_INVALID_PARAMETER), or when trying to access + /* Netapps don't implement FileNetworkOpenInformation. */ + status = fs.is_netapp () + ? STATUS_INVALID_PARAMETER + : NtQueryInformationFile (h, &io, pfnoi, sizeof *pfnoi, + FileNetworkOpenInformation); + if (status == STATUS_INVALID_PARAMETER + || status == STATUS_NOT_IMPLEMENTED) + { + /* Apart from accessing Netapps, this also occurs when + accessing SMB share root dirs hosted on NT4 + (STATUS_INVALID_PARAMETER), or when trying to access SMB share root dirs from NT4 (STATUS_NOT_IMPLEMENTED). */ FILE_BASIC_INFORMATION fbi; + FILE_STANDARD_INFORMATION fsi; status = NtQueryInformationFile (h, &io, &fbi, sizeof fbi, FileBasicInformation); if (NT_SUCCESS (status)) { memcpy (pfnoi, &fbi, 4 * sizeof (LARGE_INTEGER)); - pfnoi->EndOfFile.QuadPart - = pfnoi->AllocationSize.QuadPart = 0; + if (NT_SUCCESS (NtQueryInformationFile (h, &io, &fsi, + sizeof fsi, + FileStandardInformation))) + { + pfnoi->EndOfFile.QuadPart = fsi.EndOfFile.QuadPart; + pfnoi->AllocationSize.QuadPart + = fsi.AllocationSize.QuadPart; + } + else + pfnoi->EndOfFile.QuadPart + = pfnoi->AllocationSize.QuadPart = 0; pfnoi->FileAttributes = fbi.FileAttributes; } }