Commit fc30171
fix(decoder): report OutputFull when the output buffer is full
A RawDecoder that buffers a whole block internally (notably bzip2, which
absorbs an entire BWT block before draining it) could make a naive decode
loop fail with UnexpectedEnd. When the caller's output buffer filled
mid-block, the RawDecoder->Decoder bridge derived Status purely from
consumed >= input.len(); since the decoder had already swallowed all the
input, it returned InputEmpty instead of OutputFull. A loop that stops on
InputEmpty then called finish() on a half-drained stream and got
UnexpectedEnd — even on the decoder's own encoder output.
Return OutputFull whenever the output buffer is full (and non-empty),
which is always the correct "drain and call again" signal; a later call
with no remaining input yields InputEmpty once pending bytes are out.
Genuine truncation still errors (that path returns with output not full).
Adds round_trip_small_output_buffer_naive_loop, which drives the exact
documented decode loop with 1/64/4096/65536-byte output buffers over
100 KB-1 MB inputs and failed with UnexpectedEnd before this change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>1 parent ee147c8 commit fc30171
3 files changed
Lines changed: 72 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
10 | 22 | | |
11 | 23 | | |
12 | 24 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
364 | 364 | | |
365 | 365 | | |
366 | 366 | | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
367 | 378 | | |
368 | 379 | | |
369 | 380 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
268 | 268 | | |
269 | 269 | | |
270 | 270 | | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
271 | 320 | | |
272 | 321 | | |
273 | 322 | | |
| |||
0 commit comments