1
0
mirror of https://git.tukaani.org/xz.git synced 2026-10-31 03:14:56 +00:00

Tests: Add a fuzzer for .xz Index decoding

Normal .xz decoding uses lzma_index_hash, so this new fuzzer doesn't
overlap with the existing fuzzers.
This commit is contained in:
Lasse Collin 2026-09-09 14:14:40 +03:00
parent 65198524f0
commit df5bfb4547
No known key found for this signature in database
GPG Key ID: 38EE757D69184620

View File

@ -0,0 +1,66 @@
// SPDX-License-Identifier: 0BSD
///////////////////////////////////////////////////////////////////////////////
//
/// \file fuzz_decode_alone.c
/// \brief Fuzz test program for .xz Index decoding
//
// Author: Lasse Collin
//
///////////////////////////////////////////////////////////////////////////////
#include <inttypes.h>
#include <stdlib.h>
#include <stdio.h>
#include "lzma.h"
#include "fuzz_common.h"
extern int
LLVMFuzzerTestOneInput(const uint8_t *inbuf, size_t inbuf_size)
{
lzma_stream strm = LZMA_STREAM_INIT;
prepare_stream(&strm, inbuf, inbuf_size);
lzma_ret ret;
for (int i = 0; i < 3; ++i) {
// The initial pointer value must be ignored.
lzma_index *idx = (void *)1;
ret = lzma_index_decoder(&strm, &idx, MEM_LIMIT);
if (ret == LZMA_MEM_ERROR)
continue;
if (ret != LZMA_OK) {
// This should never happen unless the system has
// no free memory or address space to allow the small
// allocations that the initialization requires.
fprintf(stderr, "lzma_index_decoder() failed (%d)\n",
ret);
abort();
}
fuzz_code(&strm, strm.next_in, strm.avail_in);
lzma_index_end(idx, NULL);
}
{
// Fuzz the single-call API too.
lzma_index *idx = (void *)1;
uint64_t memlimit = MEM_LIMIT;
size_t inbuf_pos = 0;
if (lzma_index_buffer_decode(&idx, &memlimit, NULL,
inbuf, &inbuf_pos, inbuf_size)
== LZMA_PROG_ERROR) {
fprintf(stderr, "lzma_index_buffer_decode() failed "
"with LZMA_PROG_ERROR\n");
abort();
}
lzma_index_end(idx, NULL);
}
lzma_end(&strm);
return 0;
}