Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2023-01-22 22:11:59 +0300
committerCorinna Vinschen <corinna@vinschen.de>2023-01-22 22:16:13 +0300
commit33e4340d44a8a316d548de6344ee6d1aa6c5fb7f (patch)
treeace04a2d64fe9fde6232252910805d464b33bcbf
parent17ad18afc62ceefe01273e4c2fff9114275ab909 (diff)
Cygwin: mount: allow any valid character in UNC paths
The current code only allows server and share names to start with ASCII chars [a-zA-Z0-9],, which is not correct. Rather, check for a valid share character. Fixes: 1fd5e000ace55 ("import winsup-2000-02-17 snapshot") Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r--winsup/cygwin/mount.cc15
-rw-r--r--winsup/cygwin/release/3.4.63
2 files changed, 15 insertions, 3 deletions
diff --git a/winsup/cygwin/mount.cc b/winsup/cygwin/mount.cc
index 63c9d2874..61e4c5d33 100644
--- a/winsup/cygwin/mount.cc
+++ b/winsup/cygwin/mount.cc
@@ -42,11 +42,20 @@ bool NO_COPY mount_info::got_usr_bin;
bool NO_COPY mount_info::got_usr_lib;
int NO_COPY mount_info::root_idx = -1;
-/* is_unc_share: Return non-zero if PATH begins with //server/share
+/* is_native_path: Return non-zero if PATH starts with \??\[a-zA-Z] or
+ with \\?\[a-zA-Z] or with \\.\[a-zA-Z].
+
+ 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. */
+/* list of invalid chars in UNC filenames. These are a few more than
+ for "normal" filenames. */
+const char _invalid_char[] = "\"/\\[]:|<>+=;,?*";
+#define valid_share_char(_c) (strchr (_invalid_char, (_c)) == NULL)
+
static inline bool
is_native_path (const char *path)
{
@@ -63,9 +72,9 @@ is_unc_share (const char *path)
const char *p;
return (isdirsep (path[0])
&& isdirsep (path[1])
- && isalnum (path[2])
+ && valid_share_char (path[2])
&& ((p = strpbrk (path + 3, "\\/")) != NULL)
- && isalnum (p[1]));
+ && valid_share_char (p[1]));
}
/* Return true if src_path is a valid, internally supported device name.
diff --git a/winsup/cygwin/release/3.4.6 b/winsup/cygwin/release/3.4.6
index c1476ff46..c21c44fbf 100644
--- a/winsup/cygwin/release/3.4.6
+++ b/winsup/cygwin/release/3.4.6
@@ -3,3 +3,6 @@ Bug Fixes
Fix a problem that fsync returns EINVAL for block device.
Addresses: https://cygwin.com/pipermail/cygwin/2023-January/252916.html
+
+Don't reject valid server and share names when mounting.
+Addresses: https://cygwin.com/pipermail/cygwin/2023-January/252928.html