Skip to content

LibGfx/JBIG2: Fix cross-chunk segment refs in embedded organization#26199

Merged
nico merged 1 commit intoSerenityOS:masterfrom
nico:jbig2-regression-fix
Sep 10, 2025
Merged

LibGfx/JBIG2: Fix cross-chunk segment refs in embedded organization#26199
nico merged 1 commit intoSerenityOS:masterfrom
nico:jbig2-regression-fix

Conversation

@nico
Copy link
Contributor

@nico nico commented Sep 9, 2025

The extra validation in #26191 was added at the end of decode_segment_headers(). But in decode_embedded(), that can be called several times, once for each data chunk.

We want to decode segment headers from all chunks first before we do validation, so that segments in later chunks can refer to segments in earlier chunks.

Add a new complete_decoding_all_segment_headers() to house the validation code, and call it after all segment chunks have been decoded.

Unbreaks rendering 0000372.pdf page 11 and 0000857.pdf pages 1-4.

The extra validation in SerenityOS#26191 was added at the end of
decode_segment_headers(). But in decode_embedded(), that can be called
several times, once for each data chunk.

We want to decode segment headers from all chunks first before we
do validation, so that segments in later chunks can refer to segments
in earlier chunks.

Add a new complete_decoding_all_segment_headers() to house the
validation code, and call it after all segment chunks have been
decoded.

Unbreaks rendering 0000372.pdf page 11 and 0000857.pdf pages 1-4.
@github-actions github-actions bot added the 👀 pr-needs-review PR needs review from a maintainer or community member label Sep 9, 2025
@nico nico merged commit b1d6dbd into SerenityOS:master Sep 10, 2025
12 checks passed
@nico nico deleted the jbig2-regression-fix branch September 10, 2025 01:35
@github-actions github-actions bot removed the 👀 pr-needs-review PR needs review from a maintainer or community member label Sep 10, 2025
nico added a commit to nico/serenity that referenced this pull request Sep 10, 2025
Test case created by copying
Tests/LibGfx/test-inputs/jbig2/bitmap-symbol.jbig2, changing the byte at
offset 0x31 from 0x01 to 0x00 to make the symbol dictionary segment a
global segment instead of associated with page 1, then ran
Meta/jbig2_to_pdf.py on that modified file to create the new PDF.

The new file contains a JBIG2Globals stream with the symbol dictionary
segment, which the main jbig2 data stream refers to.

This would've caught the regression fixed in SerenityOS#26199.
nico added a commit to nico/serenity that referenced this pull request Sep 10, 2025
Test case created by copying
Tests/LibGfx/test-inputs/jbig2/bitmap-symbol.jbig2, changing the byte at
offset 0x31 from 0x01 to 0x00 to make the symbol dictionary segment a
global segment instead of associated with page 1, then ran
Meta/jbig2_to_pdf.py on that modified file to create the new PDF.

The new file contains a JBIG2Globals stream with the symbol dictionary
segment, which the main jbig2 data stream refers to.

This would've caught the regression fixed in SerenityOS#26199.
nico added a commit that referenced this pull request Sep 10, 2025
Test case created by copying
Tests/LibGfx/test-inputs/jbig2/bitmap-symbol.jbig2, changing the byte at
offset 0x31 from 0x01 to 0x00 to make the symbol dictionary segment a
global segment instead of associated with page 1, then ran
Meta/jbig2_to_pdf.py on that modified file to create the new PDF.

The new file contains a JBIG2Globals stream with the symbol dictionary
segment, which the main jbig2 data stream refers to.

This would've caught the regression fixed in #26199.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant