From 835bc129356e2cfd15109b53e41042fd52f622aa Mon Sep 17 00:00:00 2001 From: ZainnQureshii <43629888+ZainnQureshii@users.noreply.github.com> Date: Tue, 10 Nov 2026 20:58:22 +0100 Subject: [PATCH] cli: fix --memlimit-decompress= argument parsing longCommandWArg() matches by prefix, and the --memlimit branch came before --memlimit-decompress, so --memlimit-decompress=8M matched --memlimit and left "-decompress=8M" for NEXT_UINT32, which then read the next argument as the value. Check the longer alias first, and add a CLI test for all three spellings in both argument forms. --- programs/zstdcli.c | 2 +- tests/cli-tests/basic/memlimit_alias.sh | 15 +++++++++++++++ .../basic/memlimit_alias.sh.stderr.exact | 0 .../basic/memlimit_alias.sh.stdout.exact | 0 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100755 tests/cli-tests/basic/memlimit_alias.sh create mode 100644 tests/cli-tests/basic/memlimit_alias.sh.stderr.exact create mode 100644 tests/cli-tests/basic/memlimit_alias.sh.stdout.exact diff --git a/programs/zstdcli.c b/programs/zstdcli.c index d0821db9741..2247ab9d686 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -1102,9 +1102,9 @@ int main(int argCount, const char* argv[]) } #endif if (longCommandWArg(&argument, "--threads")) { NEXT_UINT32(nbWorkers); setThreads_non1 = (nbWorkers != 1); continue; } + if (longCommandWArg(&argument, "--memlimit-decompress")) { NEXT_UINT32(memLimit); continue; } if (longCommandWArg(&argument, "--memlimit")) { NEXT_UINT32(memLimit); continue; } if (longCommandWArg(&argument, "--memory")) { NEXT_UINT32(memLimit); continue; } - if (longCommandWArg(&argument, "--memlimit-decompress")) { NEXT_UINT32(memLimit); continue; } if (longCommandWArg(&argument, "--block-size")) { NEXT_TSIZE(chunkSize); continue; } /* hidden command, prefer --split below */ if (longCommandWArg(&argument, "--split")) { NEXT_TSIZE(chunkSize); continue; } if (longCommandWArg(&argument, "--jobsize")) { NEXT_TSIZE(chunkSize); continue; } /* note: overloaded variable */ diff --git a/tests/cli-tests/basic/memlimit_alias.sh b/tests/cli-tests/basic/memlimit_alias.sh new file mode 100755 index 00000000000..60b22733d7d --- /dev/null +++ b/tests/cli-tests/basic/memlimit_alias.sh @@ -0,0 +1,15 @@ +#!/bin/sh +set -eu + +datagen -g500K > input +zstd -q input +for option in --memlimit --memory --memlimit-decompress; do + zstd -dc "$option=8M" input.zst > output + cmp input output + zstd -dc "$option" 8M input.zst > output + cmp input output + if zstd -qdc "$option=1K" input.zst > output 2> error; then + die "Decompression exceeded the memory limit" + fi + grep -q 'Window size larger than maximum' error +done diff --git a/tests/cli-tests/basic/memlimit_alias.sh.stderr.exact b/tests/cli-tests/basic/memlimit_alias.sh.stderr.exact new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/cli-tests/basic/memlimit_alias.sh.stdout.exact b/tests/cli-tests/basic/memlimit_alias.sh.stdout.exact new file mode 100644 index 00000000000..e69de29bb2d