authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-26 20:49:37-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-08-26 21:00:58-07:00
log980445f08bfee496f4e784b05653e1698addaac8
treeb6073503e8f18cd04f8df385023ef8c058fa8f19
parent722e066173f5235b1dd1b341acb5cb1e79002ed7

std.compress.lzma: fix unpacked size checking logic


1 files changed, 3 insertions(+), 2 deletions(-)

lib/std/compress/lzma2.zig+3-2
...@@ -226,18 +226,19 @@ pub const Decode = struct {...@@ -226,18 +226,19 @@ pub const Decode = struct {
226 try ld.resetState(allocating.allocator, new_props);226 try ld.resetState(allocating.allocator, new_props);
227 }227 }
228228
229 const expected_unpacked_size = accum.len + unpacked_size;
229 const start_count = n_read;230 const start_count = n_read;
230 var range_decoder = try lzma.RangeDecoder.initCounting(reader, &n_read);231 var range_decoder = try lzma.RangeDecoder.initCounting(reader, &n_read);
231232
232 while (true) {233 while (true) {
233 if (accum.len >= unpacked_size) break;234 if (accum.len >= expected_unpacked_size) break;
234 if (range_decoder.isFinished()) break;235 if (range_decoder.isFinished()) break;
235 switch (try ld.process(reader, allocating, accum, &range_decoder, &n_read)) {236 switch (try ld.process(reader, allocating, accum, &range_decoder, &n_read)) {
236 .more => continue,237 .more => continue,
237 .finished => break,238 .finished => break,
238 }239 }
239 }240 }
240 if (accum.len != unpacked_size) return error.DecompressedSizeMismatch;241 if (accum.len != expected_unpacked_size) return error.DecompressedSizeMismatch;
241 if (n_read - start_count != packed_size) return error.CompressedSizeMismatch;242 if (n_read - start_count != packed_size) return error.CompressedSizeMismatch;
242243
243 return n_read;244 return n_read;