fuzz-compress only ever feeds the decompressors their own output: it compresses the fuzzer input and then decompresses the result, so the stream the decoders see is well formed by construction. The blobs they get in reality come out of journal files, systemd-journal-remote streams, coredumps and downloaded images, i.e. from wherever the data was written, which is not necessarily somewhere we trust. So hand them the fuzzer input directly instead, across all four entrypoints: decompress_blob(), decompress_startswith(), decompress_stream(), and the decompressor_detect()/decompressor_push() pair that systemd-importd feeds from the network. The latter is pushed in chunks, so that the decoders see the same fragmentation a real download produces. The decompressed size is capped, as an unbounded decode of a hostile blob measures the allocator rather than the decoder. The corpus carries the two truncated stream headers that used to send decompress_startswith() allocating until OOM, fixed in the previous commit.
20 B
20 B