From 507d6064eb83055240cddf455fb9f49364499672 Mon Sep 17 00:00:00 2001 From: Bryce Kwon Date: Sat, 17 Oct 2026 12:53:18 -1000 Subject: Find a compressor on the default path when unset With no PATH in the environment, the check that a compressor exists gave up and refused every compressed snapshot, though execvp would have found it on the system's default path. --- source/ui-snapshot.c | 16 ++++++++++++++-- tests/t0110-snapshot.sh | 14 ++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/source/ui-snapshot.c b/source/ui-snapshot.c index 3c00f66..dae3459 100644 --- a/source/ui-snapshot.c +++ b/source/ui-snapshot.c @@ -67,11 +67,22 @@ static int write_zip_archive(const char *hex, const char *prefix) static int program_on_path(const char *program) { const char *path = getenv("PATH"); + struct strbuf defpath = STRBUF_INIT; struct strbuf full = STRBUF_INIT; int found = 0; - if (!path) - return 0; + // A server can run cgit with no PATH at all, and execvp then searches + // a default path of the system's, which confstr reports. + if (!path) { + size_t len = confstr(_CS_PATH, NULL, 0); + + if (!len) + return 0; + strbuf_grow(&defpath, len); + confstr(_CS_PATH, defpath.buf, len); + strbuf_setlen(&defpath, len - 1); + path = defpath.buf; + } while (!found) { const char *end = strchrnul(path, ':'); @@ -86,6 +97,7 @@ static int program_on_path(const char *program) path = end + 1; } strbuf_release(&full); + strbuf_release(&defpath); return found; } diff --git a/tests/t0110-snapshot.sh b/tests/t0110-snapshot.sh index ec0a0b8..373a05d 100755 --- a/tests/t0110-snapshot.sh +++ b/tests/t0110-snapshot.sh @@ -167,4 +167,18 @@ test_expect_success 'an empty snapshot-prefix puts no slash ahead of the members ! grep "^/" members ' +# A server may run cgit with no PATH at all, and the compressor is then looked +# for on the default path execvp searches. +test_expect_success GZIP 'a compressed snapshot is made without a PATH' ' + sed "s/^cache-size=.*/cache-size=0/" cgitrc >nopathrc && + cgit_bin=$(command -v cgit) && + ( + unset PATH && + CGIT_CONFIG="$PWD/nopathrc" QUERY_STRING="url=foo/snapshot/master.tar.gz" "$cgit_bin" >tmp + ) && + grep "^Status: 200" tmp && + strip_headers nopath.tar.gz && + gzip -t nopath.tar.gz +' + test_done -- cgit