diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2023-01-22 22:11:59 +0300 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2023-01-22 22:16:13 +0300 |
commit | 33e4340d44a8a316d548de6344ee6d1aa6c5fb7f (patch) | |
tree | ace04a2d64fe9fde6232252910805d464b33bcbf | |
parent | 17ad18afc62ceefe01273e4c2fff9114275ab909 (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.cc | 15 | ||||
-rw-r--r-- | winsup/cygwin/release/3.4.6 | 3 |
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 |