aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorK900 <me@0upti.me>2024-06-20 08:54:43 +0300
committerK900 <me@0upti.me>2024-06-20 09:21:13 +0300
commit7d52d74bbe39376f331887759020cff097dace55 (patch)
tree1403dd70b62c2922fe0859728949529c19e2aa7e /src
parentfb7d3154115cb5cf211c5ddbc124e17ee519bb64 (diff)
BrotliDecompressionSource: don't bail out too early
If we've consumed the entire input, that doesn't actually mean we're done decompressing - there might be more output left. This worked (?) in most cases because the input and output sizes are pretty comparable, but sometimes they're not and then things get very funny. Change-Id: I73435a654a911b8ce25119f713b80706c5783c1b
Diffstat (limited to 'src')
-rw-r--r--src/libutil/compression.cc25
1 files changed, 13 insertions, 12 deletions
diff --git a/src/libutil/compression.cc b/src/libutil/compression.cc
index d93a1b1d6..a66069e52 100644
--- a/src/libutil/compression.cc
+++ b/src/libutil/compression.cc
@@ -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();
+ } 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");
- }
+ if (!BrotliDecoderDecompressStream(
+ state.get(), &avail_in, &next_in, &len, &out, nullptr
+ ))
+ {
+ throw CompressionError("error while decompressing brotli file");
}
- } catch (EndOfFile &) {
}
if (begin != out) {