diff options
-rw-r--r--source/ui-snapshot.c16
-rwxr-xr-xtests/t0110-snapshot.sh14
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 <tmp >nopath.tar.gz &&
+ gzip -t nopath.tar.gz
+'
+
test_done