summaryrefslogtreecommitdiffstats
path: root/winsup/utils/cygpath.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/utils/cygpath.cc')
-rw-r--r--winsup/utils/cygpath.cc14
1 files changed, 12 insertions, 2 deletions
diff --git a/winsup/utils/cygpath.cc b/winsup/utils/cygpath.cc
index 2ba727a9c..449c5436e 100644
--- a/winsup/utils/cygpath.cc
+++ b/winsup/utils/cygpath.cc
@@ -233,8 +233,18 @@ get_device_name (char *path)
ans.MaximumLength = len;
ans.Buffer = ret + 4;
RtlUnicodeStringToAnsiString (&ans, &odi->ObjectName, FALSE);
- ZwClose (dir);
- goto out;
+ /* Special case for local disks: It's most feasible if the
+ DOS device name reflects the DOS drive, so we check for this
+ explicitly and only return prematurely if so. */
+#define HARDDISK_PREFIX L"\\Device\\Harddisk"
+ if (ntdev.Length < wcslen (HARDDISK_PREFIX)
+ || wcsncasecmp (ntdev.Buffer, HARDDISK_PREFIX, 8) != 0
+ || (odi->ObjectName.Length == 2 * sizeof (WCHAR)
+ && odi->ObjectName.Buffer[1] == L':'))
+ {
+ ZwClose (dir);
+ goto out;
+ }
}
}
ZwClose (dir);