forked from lix-project/lix
Merge "BrotliDecompressionSource: don't bail out too early" into main
This commit is contained in:
commit
697ef65c14
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
* --------------------------------------------------------------------------*/
|
* --------------------------------------------------------------------------*/
|
||||||
|
|
Loading…
Reference in a new issue