Commit 10dfae83 for xz
commit 10dfae83fd3b63c32c0e170540e98c4b25bf02c6
Author: Lasse Collin <lasse.collin@tukaani.org>
Date: Mon Jul 20 20:00:06 2026 +0300
Tests: test_index: Add a test for the Index decoder memusage bug
diff --git a/tests/test_index.c b/tests/test_index.c
index d195fc17..8ef5cb40 100644
--- a/tests/test_index.c
+++ b/tests/test_index.c
@@ -1622,6 +1622,53 @@ test_lzma_index_decoder(void)
}
+static void
+test_lzma_index_decoder_memusage(void)
+{
+#ifndef HAVE_DECODERS
+ assert_skip("Decoder support disabled");
+#else
+ assert_uint(decode_buffer_size, >, 20);
+
+ lzma_stream strm = LZMA_STREAM_INIT;
+ lzma_index *idx = NULL;
+ assert_lzma_ret(lzma_index_decoder(&strm, &idx, MEMLIMIT), LZMA_OK);
+
+ // Nothing decoded yet.
+ assert_uint(lzma_memusage(&strm), <, 1000);
+
+ const size_t step = 5;
+ size_t remaining = decode_buffer_size;
+ strm.next_in = decode_buffer;
+ strm.avail_in = step;
+ remaining -= strm.avail_in;
+
+ uint64_t memused = 0;
+
+ while (true) {
+ lzma_ret ret = lzma_code(&strm, LZMA_RUN);
+ if (ret == LZMA_STREAM_END)
+ break;
+
+ assert_lzma_ret(ret, LZMA_OK);
+ assert_uint_eq(strm.avail_in, 0);
+ strm.avail_in = my_min(remaining, step);
+ remaining -= strm.avail_in;
+
+ if (memused == 0) {
+ memused = lzma_memusage(&strm);
+ assert_uint(memused, >, 100);
+ } else {
+ assert_uint_eq(lzma_memusage(&strm), memused);
+ }
+ }
+
+ lzma_index_end(idx, NULL);
+ lzma_end(&strm);
+#endif
+}
+
+
static void
test_lzma_index_buffer_encode(void)
{
@@ -1831,6 +1878,7 @@ main(int argc, char **argv)
tuktest_run(test_lzma_index_dup);
tuktest_run(test_lzma_index_encoder);
tuktest_run(test_lzma_index_decoder);
+ tuktest_run(test_lzma_index_decoder_memusage);
tuktest_run(test_lzma_index_buffer_encode);
tuktest_run(test_lzma_index_buffer_decode);
tuktest_run(test_decode_empty_and_append);