summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog5
-rw-r--r--winsup/cygwin/path.cc12
2 files changed, 17 insertions, 0 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index d6b17439d..d1c1ae7c3 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,10 @@
2008-07-31 Corinna Vinschen <corinna@vinschen.de>
+ * path.cc (symlink_info::check): Handle (and explain) a special case
+ when accessing files matching DOS device names on SMB shares.
+
+2008-07-31 Corinna Vinschen <corinna@vinschen.de>
+
* spawn.cc (spawn_guts): Check constructed short pathname for being
a DOS device name and fall back to long path name, if so.
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index 66e174771..64d8759b6 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -2440,6 +2440,18 @@ symlink_info::check (char *path, const suffix_info *suffixes, unsigned opt,
{
debug_printf ("%p = NtQueryDirectoryFile(%S)",
status, &dirname);
+ if (status == STATUS_NO_SUCH_FILE)
+ {
+ /* This can happen when trying to access files
+ which match DOS device names on SMB shares.
+ NtOpenFile failed with STATUS_ACCESS_DENIED,
+ but the NtQueryDirectoryFile tells us the
+ file doesn't exist. We're suspicious in this
+ case and retry with the next suffix instead of
+ just giving up. */
+ set_error (ENOENT);
+ continue;
+ }
fileattr = 0;
}
else