]> git.ipfire.org Git - thirdparty/git.git/commitdiff
mingw: do not treat `COM0` as a reserved file name
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Wed, 8 Apr 2020 18:06:49 +0000 (18:06 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 8 Apr 2020 19:15:51 +0000 (12:15 -0700)
In 4dc42c6c186 (mingw: refuse paths containing reserved names,
2019-12-21), we started disallowing file names that are reserved, e.g.
`NUL`, `CONOUT$`, etc.

This included `COM<n>` where `<n>` is a digit. Unfortunately, this
includes `COM0` but only `COM1`, ..., `COM9` are reserved, according to
the official documentation, `COM0` is mentioned in the "NT Namespaces"
section but it is explicitly _omitted_ from the list of reserved names:
https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions

Tests corroborate this: it is totally possible to write a file called
`com0.c` on Windows 10, but not `com1.c`.

So let's tighten the code to disallow only the reserved `COM<n>` file
names, but to allow `COM0` again.

This fixes https://github.com/git-for-windows/git/issues/2470.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
compat/mingw.c
t/t0060-path-utils.sh

index 2136744af3588600134f1f357b8fea40ba14d28f..f2c94f9d0849c7fd19890e17df57adffa4ad6c83 100644 (file)
@@ -2590,12 +2590,14 @@ not_a_reserved_name:
                                        continue;
                                }
                                break;
-                       case 'c': case 'C': /* COM<N>, CON, CONIN$, CONOUT$ */
+                       case 'c': case 'C':
+                               /* COM1 ... COM9, CON, CONIN$, CONOUT$ */
                                if ((c = path[++i]) != 'o' && c != 'O')
                                        goto not_a_reserved_name;
                                c = path[++i];
-                               if (c == 'm' || c == 'M') { /* COM<N> */
-                                       if (!isdigit(path[++i]))
+                               if (c == 'm' || c == 'M') { /* COM1 ... COM9 */
+                                       c = path[++i];
+                                       if (c < '1' || c > '9')
                                                goto not_a_reserved_name;
                                } else if (c == 'n' || c == 'N') { /* CON */
                                        c = path[i + 1];
index 2ea2d00c39a6a53ae121dd35014a4c539ea1b35b..56db5c8abab62e7ae327bece57768f0f4ae6f0e4 100755 (executable)
@@ -476,6 +476,7 @@ test_expect_success MINGW 'is_valid_path() on Windows' '
                C:\\git \
                comm \
                conout.c \
+               com0.c \
                lptN \
                \
                --not \
@@ -488,6 +489,7 @@ test_expect_success MINGW 'is_valid_path() on Windows' '
                "AUX.c" \
                "abc/conOut\$  .xyz/test" \
                lpt8 \
+               com9.c \
                "lpt*" \
                Nul \
                "PRN./abc"