Merge "BrotliDecompressionSource: don't bail out too early" into main
This commit is contained in:
commit
697ef65c14
2 changed files with 24 additions and 13 deletions
|
@ -163,23 +163,24 @@ struct BrotliDecompressionSource : Source
|
|||
uint8_t * out = (uint8_t *) data;
|
||||
const auto * begin = out;
|
||||
|
||||
try {
|
||||
while (len && !BrotliDecoderIsFinished(state.get())) {
|
||||
checkInterrupt();
|
||||
while (len && !BrotliDecoderIsFinished(state.get())) {
|
||||
checkInterrupt();
|
||||
|
||||
while (avail_in == 0) {
|
||||
while (avail_in == 0) {
|
||||
try {
|
||||
avail_in = inner->read(buf.get(), BUF_SIZE);
|
||||
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 &) {
|
||||
break;
|
||||
}
|
||||
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) {
|
||||
|
|
|
@ -66,6 +66,16 @@ namespace nix {
|
|||
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
|
||||
* --------------------------------------------------------------------------*/
|
||||
|
|
Loading…
Reference in a new issue