From ac8d80a8e4a66053c765bcf3cf9e0f750cc3e093 Mon Sep 17 00:00:00 2001 From: Gaurang Bhatia Date: Sun, 7 Dec 2025 06:46:16 +0530 Subject: [PATCH] Fix infinite loop in JBIG2 decoder with >4 referred-to segments and add regression test --- src/core/jbig2.js | 6 +++--- test/pdfs/.gitignore | 1 + test/pdfs/issue20439.pdf | Bin 0 -> 1300 bytes test/test_manifest.json | 7 +++++++ 4 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 test/pdfs/issue20439.pdf diff --git a/src/core/jbig2.js b/src/core/jbig2.js index df689d963..e31bd1f5e 100644 --- a/src/core/jbig2.js +++ b/src/core/jbig2.js @@ -1165,15 +1165,15 @@ function readSegmentHeader(data, start) { let referredToCount = (referredFlags >> 5) & 7; const retainBits = [referredFlags & 31]; let position = start + 6; - if (referredFlags === 7) { + if (referredToCount === 7) { referredToCount = readUint32(data, position - 1) & 0x1fffffff; position += 3; - let bytes = (referredToCount + 7) >> 3; + let bytes = (referredToCount + 8) >> 3; retainBits[0] = data[position++]; while (--bytes > 0) { retainBits.push(data[position++]); } - } else if (referredFlags === 5 || referredFlags === 6) { + } else if (referredToCount === 5 || referredToCount === 6) { throw new Jbig2Error("invalid referred-to flags"); } diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index e2bb0f1e8..be41a6b37 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -749,6 +749,7 @@ !comments.pdf !issue20319_1.pdf !issue20319_2.pdf +!issue20439.pdf !bug1992868.pdf !bug1937438_af_from_latex.pdf !bug1937438_from_word.pdf diff --git a/test/pdfs/issue20439.pdf b/test/pdfs/issue20439.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5ed98c756706fdbc43d889ffcddc7b1b1dba7b75 GIT binary patch literal 1300 zcmY!laBnwZN4vLECQ zpc}w+axNFhM3;O}*g)05LJ4FI!k19POwEiyE`@|N)O8?%;L@ZLaOivH0>d065}ug? zv>a$5h~tr(nVwMsvKGX1&d-kPaK{IiKyK|;a{#+8`ZomKk8lWT-M27(u9W5q*@8s#| z-wZB3W!4#d_e!mkYZ~{PDf8C!)q}M%L$q38(b^nmury$Tf#F>l-T-NF*P=oV_|bw&R;W zL!I!{_u7A%W^ZK{{q_