Merge "BrotliDecompressionSource: don't bail out too early" into main

This commit is contained in:
Ilya K 2024-06-20 07:06:52 +00:00 committed by Gerrit Code Review
commit 697ef65c14
2 changed files with 24 additions and 13 deletions

View file

@ -163,23 +163,24 @@ struct BrotliDecompressionSource : Source
uint8_t * out = (uint8_t *) data; uint8_t * out = (uint8_t *) data;
const auto * begin = out; const auto * begin = out;
try { while (len && !BrotliDecoderIsFinished(state.get())) {
while (len && !BrotliDecoderIsFinished(state.get())) { checkInterrupt();
checkInterrupt();
while (avail_in == 0) { while (avail_in == 0) {
try {
avail_in = inner->read(buf.get(), BUF_SIZE); avail_in = inner->read(buf.get(), BUF_SIZE);
next_in = (const uint8_t *) buf.get(); } catch (EndOfFile &) {
} break;
if (!BrotliDecoderDecompressStream(
state.get(), &avail_in, &next_in, &len, &out, nullptr
))
{
throw CompressionError("error while decompressing brotli file");
} }
next_in = (const uint8_t *) buf.get();
}
if (!BrotliDecoderDecompressStream(
state.get(), &avail_in, &next_in, &len, &out, nullptr
))
{
throw CompressionError("error while decompressing brotli file");
} }
} catch (EndOfFile &) {
} }
if (begin != out) { if (begin != out) {

View file

@ -66,6 +66,16 @@ namespace nix {
ASSERT_THROW(decompress(method, str), CompressionError); ASSERT_THROW(decompress(method, str), CompressionError);
} }
TEST(decompress, veryLongBrotli) {
auto method = "br";
auto str = std::string(65536, 'a');
auto o = decompress(method, compress(method, str));
// This is just to not print 64k of "a" for most failures
ASSERT_EQ(o.length(), str.length());
ASSERT_EQ(o, str);
}
/* ---------------------------------------------------------------------------- /* ----------------------------------------------------------------------------
* compression sinks * compression sinks
* --------------------------------------------------------------------------*/ * --------------------------------------------------------------------------*/