Merge branch 'js/bs-is-a-dir-sep-on-windows'
authorJunio C Hamano <gitster@pobox.com>
Fri, 2 Jun 2017 06:05:58 +0000 (15:05 +0900)
committerJunio C Hamano <gitster@pobox.com>
Fri, 2 Jun 2017 06:05:58 +0000 (15:05 +0900)
"foo\bar\baz" in "git fetch foo\bar\baz", even though there is no
slashes in it, cannot be a nickname for a remote on Windows, as
that is likely to be a pathname on a local filesystem.

* js/bs-is-a-dir-sep-on-windows:
Windows: do not treat a path with backslashes as a remote's nick name
mingw.h: permit arguments with side effects for is_dir_sep

compat/mingw.h
remote.c
index 33501695550accdb08368aa867b9addb25c90d5f..e03aecfe2e6556e1ef513922104557373eaa9260 100644 (file)
@@ -398,7 +398,11 @@ HANDLE winansi_get_osfhandle(int fd);
        (isalpha(*(path)) && (path)[1] == ':' ? 2 : 0)
 int mingw_skip_dos_drive_prefix(char **path);
 #define skip_dos_drive_prefix mingw_skip_dos_drive_prefix
-#define is_dir_sep(c) ((c) == '/' || (c) == '\\')
+static inline int mingw_is_dir_sep(int c)
+{
+       return c == '/' || c == '\\';
+}
+#define is_dir_sep mingw_is_dir_sep
 static inline char *mingw_find_last_dir_sep(const char *path)
 {
        char *ret = NULL;
index fdc52d802cec6b5322689f1fda79c9cabe9dbb01..e43b1460f89cb673227a28ec9357f99237146563 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -649,7 +649,12 @@ static int valid_remote_nick(const char *name)
 {
        if (!name[0] || is_dot_or_dotdot(name))
                return 0;
-       return !strchr(name, '/'); /* no slash */
+
+       /* remote nicknames cannot contain slashes */
+       while (*name)
+               if (is_dir_sep(*name++))
+                       return 0;
+       return 1;
 }
 
 const char *remote_for_branch(struct branch *branch, int *explicit)