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