From 7e2b8e7d2a285b621130654523ed274eb0db277b Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 30 Apr 2008 08:49:23 +0000 Subject: [PATCH] * mount.cc (is_unc_share): Allow \\?\ prefix as well. Enhance comment. (mount_info::from_fstab): Remove patch from 2008-04-29. * mount.cc (mount_info::conv_to_posix_path): Simplify test for native UNC path. * path.cc (normalize_win32_path): Ditto. (symlink_worker): Ditto. (symlink_info::posixify): Ditto. (cygwin_conv_path): Ditto. --- winsup/cygwin/ChangeLog | 12 ++++++++++++ winsup/cygwin/mount.cc | 18 +++++++----------- winsup/cygwin/path.cc | 16 ++++++---------- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 231664b54..f0585d883 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2008-04-30 Corinna Vinschen + + * mount.cc (is_unc_share): Allow \\?\ prefix as well. Enhance comment. + (mount_info::from_fstab): Remove patch from 2008-04-29. + + * mount.cc (mount_info::conv_to_posix_path): Simplify test for native + UNC path. + * path.cc (normalize_win32_path): Ditto. + (symlink_worker): Ditto. + (symlink_info::posixify): Ditto. + (cygwin_conv_path): Ditto. + 2008-04-29 Corinna Vinschen * mount.cc (mount_info::from_fstab): Skip native path prefix in diff --git a/winsup/cygwin/mount.cc b/winsup/cygwin/mount.cc index 5fdef2d09..0f13697b3 100644 --- a/winsup/cygwin/mount.cc +++ b/winsup/cygwin/mount.cc @@ -42,7 +42,10 @@ details. */ #define isproc(path) \ (path_prefix_p (proc, (path), proc_len)) -/* is_unc_share: Return non-zero if PATH begins with //UNC/SHARE */ +/* is_unc_share: Return non-zero if PATH begins with //server/share + or with one of the native prefixes //./ or //?/ + This function is only used to test for valid input strings. + The later normalization drops the native prefixes. */ static inline bool __stdcall is_unc_share (const char *path) @@ -50,7 +53,7 @@ is_unc_share (const char *path) const char *p; return (isdirsep (path[0]) && isdirsep (path[1]) - && (isalnum (path[2]) || path[2] == '.') + && (isalnum (path[2]) || path[2] == '.' || path[2] == '?') && ((p = strpbrk (path + 3, "\\/")) != NULL) && isalnum (p[1])); } @@ -576,10 +579,9 @@ mount_info::conv_to_posix_path (PWCHAR src_path, char *posix_path, if (!wcsncmp (src_path, L"\\\\?\\", 4)) { src_path += 4; - if (!wcsncmp (src_path, L"UNC\\", 4)) + if (src_path[1] != L':') /* native UNC path */ { - src_path += 2; - src_path[0] = L'\\'; + *(src_path += 2) = L'\\'; changed = true; } } @@ -881,12 +883,6 @@ mount_info::from_fstab (bool user) debug_printf ("GetModuleFileNameW, %E"); return false; } - if (!wcsncmp (path, L"\\\\?\\", 4)) - { - path += 4; - if (path[1] != L':') - *(path += 2) = L'\\'; - } w = wcsrchr (path, L'\\'); if (w) { diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc index ef4ebec51..01847c742 100644 --- a/winsup/cygwin/path.cc +++ b/winsup/cygwin/path.cc @@ -1353,7 +1353,7 @@ normalize_win32_path (const char *src, char *dst, char *&tail) && src[2] == '?' && isdirsep (src[3])) { src += 4; - if (ascii_strncasematch (src, "UNC", 3)) + if (src[1] != ':') /* native UNC path */ { src += 2; /* Fortunately the first char is not copied... */ beg_src_slash = true; @@ -1643,10 +1643,9 @@ symlink_worker (const char *oldpath, const char *newpath, bool use_winsym, takes a wide char path name, it does not understand the Win32 prefix for long pathnames! So we have to tack off the prefix and convert the path to the "normal" syntax - for ParseDisplayName. I have no idea if it's able to take - long path names at all since I can't test it right now. */ + for ParseDisplayName. */ WCHAR *wc = wc_path + 4; - if (!wcsncmp (wc, L"UNC\\", 4)) + if (wc[1] != L':') /* native UNC path */ *(wc += 2) = L'\\'; HRESULT res; if (SUCCEEDED (res = psl->ParseDisplayName (NULL, NULL, wc, NULL, @@ -2013,11 +2012,8 @@ symlink_info::posixify (char *srcbuf) if (srcbuf[0] == '\\' && !strncmp (srcbuf + 1, "??\\", 3)) { srcbuf += 4; - if (!strncmp (srcbuf, "UNC\\", 4)) - { - srcbuf += 2; - *srcbuf = '\\'; - } + if (srcbuf[1] != ':') /* native UNC path */ + *(srcbuf += 2) = '\\'; } if (isdrive (srcbuf)) mount_table->conv_to_posix_path (srcbuf, contents, 0); @@ -2729,7 +2725,7 @@ cygwin_conv_path (cygwin_conv_path_t what, const void *from, void *to, buf = tp.c_get (); sys_wcstombs (buf, NT_MAX_PATH, up->Buffer, up->Length / sizeof (WCHAR)); buf += 4; /* Skip \??\ */ - if (ascii_strncasematch (buf, "UNC\\", 4)) + if (buf[1] != ':') /* native UNC path */ *(buf += 2) = '\\'; lsiz = strlen (buf) + 1; break;