Skip to content

Commit b3eb70e

Browse files
committed
Merge branch 'js/mingw-fixes'
Misc fixes for Windows. * js/mingw-fixes: mingw: help debugging by optionally executing bash with strace mingw: do not treat `COM0` as a reserved file name mingw: use modern strftime implementation if possible
2 parents 95ca489 + 3efc128 commit b3eb70e

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

compat/mingw.c

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,16 @@ int mingw_utime (const char *file_name, const struct utimbuf *times)
964964
size_t mingw_strftime(char *s, size_t max,
965965
const char *format, const struct tm *tm)
966966
{
967-
size_t ret = strftime(s, max, format, tm);
967+
/* a pointer to the original strftime in case we can't find the UCRT version */
968+
static size_t (*fallback)(char *, size_t, const char *, const struct tm *) = strftime;
969+
size_t ret;
970+
DECLARE_PROC_ADDR(ucrtbase.dll, size_t, strftime, char *, size_t,
971+
const char *, const struct tm *);
972+
973+
if (INIT_PROC_ADDR(strftime))
974+
ret = strftime(s, max, format, tm);
975+
else
976+
ret = fallback(s, max, format, tm);
968977

969978
if (!ret && errno == EINVAL)
970979
die("invalid strftime format: '%s'", format);
@@ -1479,6 +1488,7 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
14791488
const char *(*quote_arg)(const char *arg) =
14801489
is_msys2_sh(cmd ? cmd : *argv) ?
14811490
quote_arg_msys2 : quote_arg_msvc;
1491+
const char *strace_env;
14821492

14831493
/* Make sure to override previous errors, if any */
14841494
errno = 0;
@@ -1562,6 +1572,31 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
15621572
free(quoted);
15631573
}
15641574

1575+
strace_env = getenv("GIT_STRACE_COMMANDS");
1576+
if (strace_env) {
1577+
char *p = path_lookup("strace.exe", 1);
1578+
if (!p)
1579+
return error("strace not found!");
1580+
if (xutftowcs_path(wcmd, p) < 0) {
1581+
free(p);
1582+
return -1;
1583+
}
1584+
free(p);
1585+
if (!strcmp("1", strace_env) ||
1586+
!strcasecmp("yes", strace_env) ||
1587+
!strcasecmp("true", strace_env))
1588+
strbuf_insert(&args, 0, "strace ", 7);
1589+
else {
1590+
const char *quoted = quote_arg(strace_env);
1591+
struct strbuf buf = STRBUF_INIT;
1592+
strbuf_addf(&buf, "strace -o %s ", quoted);
1593+
if (quoted != strace_env)
1594+
free((char *)quoted);
1595+
strbuf_insert(&args, 0, buf.buf, buf.len);
1596+
strbuf_release(&buf);
1597+
}
1598+
}
1599+
15651600
ALLOC_ARRAY(wargs, st_add(st_mult(2, args.len), 1));
15661601
xutftowcs(wargs, args.buf, 2 * args.len + 1);
15671602
strbuf_release(&args);
@@ -2581,12 +2616,14 @@ int is_valid_win32_path(const char *path, int allow_literal_nul)
25812616
continue;
25822617
}
25832618
break;
2584-
case 'c': case 'C': /* COM<N>, CON, CONIN$, CONOUT$ */
2619+
case 'c': case 'C':
2620+
/* COM1 ... COM9, CON, CONIN$, CONOUT$ */
25852621
if ((c = path[++i]) != 'o' && c != 'O')
25862622
goto not_a_reserved_name;
25872623
c = path[++i];
2588-
if (c == 'm' || c == 'M') { /* COM<N> */
2589-
if (!isdigit(path[++i]))
2624+
if (c == 'm' || c == 'M') { /* COM1 ... COM9 */
2625+
c = path[++i];
2626+
if (c < '1' || c > '9')
25902627
goto not_a_reserved_name;
25912628
} else if (c == 'n' || c == 'N') { /* CON */
25922629
c = path[i + 1];

t/t0060-path-utils.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,7 @@ test_expect_success MINGW 'is_valid_path() on Windows' '
476476
C:\\git \
477477
comm \
478478
conout.c \
479+
com0.c \
479480
lptN \
480481
\
481482
--not \
@@ -488,6 +489,7 @@ test_expect_success MINGW 'is_valid_path() on Windows' '
488489
"AUX.c" \
489490
"abc/conOut\$ .xyz/test" \
490491
lpt8 \
492+
com9.c \
491493
"lpt*" \
492494
Nul \
493495
"PRN./abc"

0 commit comments

Comments
 (0)