This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pdfbox-jbig2.git


The following commit(s) were added to refs/heads/master by this push:
     new aac4c67  PDFBOX-6162: fix typo; align method more closely to spec
aac4c67 is described below

commit aac4c673ba8cf3fce4e673f60094decc0a244b7d
Author: Maruan Sahyoun <[email protected]>
AuthorDate: Tue Apr 21 09:25:10 2026 +0200

    PDFBOX-6162: fix typo; align method more closely to spec
---
 .../pdfbox/jbig2/segments/SymbolDictionary.java    | 52 +++++++++++++---------
 1 file changed, 32 insertions(+), 20 deletions(-)

diff --git 
a/src/main/java/org/apache/pdfbox/jbig2/segments/SymbolDictionary.java 
b/src/main/java/org/apache/pdfbox/jbig2/segments/SymbolDictionary.java
index d2e1ff1..3b2f7e7 100644
--- a/src/main/java/org/apache/pdfbox/jbig2/segments/SymbolDictionary.java
+++ b/src/main/java/org/apache/pdfbox/jbig2/segments/SymbolDictionary.java
@@ -73,7 +73,7 @@ public class SymbolDictionary implements Dictionary
 
     /** Further parameters */
     private SegmentHeader segmentHeader;
-    private int amountOfImportedSymbolss;
+    private int amountOfImportedSymbols;
     private ArrayList<Bitmap> importSymbols;
     private int amountOfDecodedSymbols;
     private Bitmap[] newSymbols;
@@ -393,7 +393,10 @@ public class SymbolDictionary implements Dictionary
 
             if (!isHuffmanEncoded)
             {
-                resetBitmapCodingStatistics();
+                if (!isCodingContextUsed)
+                {
+                    resetBitmapCodingStatistics();
+                } 
                 resetIntegerCoderStatistics();
             }
 
@@ -649,7 +652,7 @@ public class SymbolDictionary implements Dictionary
         // 6.5.8.2 2) Parameters set according to Table 17, page 36
         textRegion.setParameters(arithmeticDecoder, iDecoder, 
isHuffmanEncoded, true, symbolWidth,
                 heightClassHeight, amountOfRefinementAggregationInstances, 1,
-                (amountOfImportedSymbolss + amountOfDecodedSymbols), (short) 
0, (short) 0,
+                (amountOfImportedSymbols + amountOfDecodedSymbols), (short) 0, 
(short) 0,
                 (short) 0, (short) 1, (short) 0, (short) 0, (short) 0, (short) 
0, (short) 0,
                 (short) 0, (short) 0, (short) 0, (short) 0, sdrTemplate, 
sdrATX, sdrATY, sbSymbols,
                 sbSymCodeLen);
@@ -865,18 +868,18 @@ public class SymbolDictionary implements Dictionary
     {
         exportSymbols = new ArrayList<Bitmap>(amountOfExportSymbolss);
 
-        for (int i = 0; i < amountOfImportedSymbolss + amountOfNewSymbols; i++)
+        for (int i = 0; i < amountOfImportedSymbols + amountOfNewSymbols; i++)
         {
 
             if (toExportFlags[i] == 1)
             {
-                if (i < amountOfImportedSymbolss)
+                if (i < amountOfImportedSymbols)
                 {
                     exportSymbols.add(importSymbols.get(i));
                 }
                 else
                 {
-                    exportSymbols.add(newSymbols[i - 
amountOfImportedSymbolss]);
+                    exportSymbols.add(newSymbols[i - amountOfImportedSymbols]);
                 }
             }
         }
@@ -884,13 +887,20 @@ public class SymbolDictionary implements Dictionary
 
     private int[] getToExportFlags() throws IOException, 
InvalidHeaderValueException
     {
-        int currentExportFlag = 0;
-        long exRunLength = 0;
-        final int[] exportFlags = new int[amountOfImportedSymbolss + 
amountOfNewSymbols];
+        // the validation could be placed a little earlier but it is needed 
here before the array creation
+        if (amountOfImportedSymbols < 0 || amountOfNewSymbols < 0 
+                || (long) amountOfImportedSymbols + amountOfNewSymbols > 
Integer.MAX_VALUE) {
+            throw new InvalidHeaderValueException(" Invalid number of symbols: 
imported=" + amountOfImportedSymbols + ", new=" + amountOfNewSymbols);
+        }
 
-        for (int exportIndex = 0; exportIndex < amountOfImportedSymbolss
-                + amountOfNewSymbols; exportIndex += exRunLength)
+        int exIndex = 0;
+        int curExFlag = 0;
+        final int total = amountOfImportedSymbols + amountOfNewSymbols;
+        final int[] exportFlags = new int[total];
+
+        while (exIndex < total)
         {
+            long exRunLength;
 
             if (isHuffmanEncoded)
             {
@@ -901,15 +911,17 @@ public class SymbolDictionary implements Dictionary
                 exRunLength = iDecoder.decode(cxIAEX);
             }
 
-            if (exRunLength != 0)
+            if (exRunLength < 0 || exRunLength > total - exIndex) {
+                throw new InvalidHeaderValueException("Invalid EXRUNLENGTH: " 
+ exRunLength);
+            }
+
+            for (int i = exIndex; i < exIndex + exRunLength; i++)
             {
-                for (int index = exportIndex; index < exportIndex + 
exRunLength; index++)
-                {
-                    exportFlags[index] = currentExportFlag;
-                }
+                exportFlags[i] = curExFlag;
             }
 
-            currentExportFlag = (currentExportFlag == 0) ? 1 : 0;
+            exIndex += (int) exRunLength;
+            curExFlag = (curExFlag == 0) ? 1 : 0;
         }
 
         return exportFlags;
@@ -948,13 +960,13 @@ public class SymbolDictionary implements Dictionary
         {
             return Math.max(
                     (int) (Math.ceil(
-                            Math.log(amountOfImportedSymbolss + 
amountOfNewSymbols) / Math.log(2))),
+                            Math.log(amountOfImportedSymbols + 
amountOfNewSymbols) / Math.log(2))),
                     1);
         }
         else
         {
             return (int) (Math
-                    .ceil(Math.log(amountOfImportedSymbolss + 
amountOfNewSymbols) / Math.log(2)));
+                    .ceil(Math.log(amountOfImportedSymbols + 
amountOfNewSymbols) / Math.log(2)));
         }
     }
 
@@ -998,7 +1010,7 @@ public class SymbolDictionary implements Dictionary
                 final SymbolDictionary sd = (SymbolDictionary) 
referredToSegmentHeader
                         .getSegmentData();
                 importSymbols.addAll(sd.getDictionary());
-                amountOfImportedSymbolss += sd.amountOfExportSymbolss;
+                amountOfImportedSymbols += sd.amountOfExportSymbolss;
             }
         }
     }

Reply via email to