Author: tilman
Date: Sun Mar  1 06:28:52 2026
New Revision: 1932085

Log:
PDFBOX-6171: rewrite getDecodeArray() so that enlarged arrays are truncated but 
keep all the checks

Modified:
   
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/SampledImageReader.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/SampledImageReader.java
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/SampledImageReader.java
  Sun Mar  1 04:20:03 2026        (r1932084)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/SampledImageReader.java
  Sun Mar  1 06:28:52 2026        (r1932085)
@@ -33,6 +33,7 @@ import javax.imageio.stream.MemoryCacheI
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 import org.apache.pdfbox.cos.COSArray;
+import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSNumber;
 import org.apache.pdfbox.filter.DecodeOptions;
 import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
@@ -741,45 +742,40 @@ final class SampledImageReader
     private static float[] getDecodeArray(PDImage pdImage) throws IOException
     {
         final COSArray cosDecode = pdImage.getDecode();
-        float[] decode = null;
 
         if (cosDecode != null)
         {
             int numberOfComponents = 
pdImage.getColorSpace().getNumberOfComponents();
-            if (cosDecode.size() != numberOfComponents * 2)
+            if (cosDecode.size() >= numberOfComponents * 2)
             {
-                if (pdImage.isStencil() && cosDecode.size() >= 2
-                        && cosDecode.get(0) instanceof COSNumber
-                        && cosDecode.get(1) instanceof COSNumber)
-                {
-                    float decode0 = ((COSNumber) 
cosDecode.get(0)).floatValue();
-                    float decode1 = ((COSNumber) 
cosDecode.get(1)).floatValue();
-                    if (decode0 >= 0 && decode0 <= 1 && decode1 >= 0 && 
decode1 <= 1)
+                boolean error = false;
+                float[] decode = new float[numberOfComponents * 2];
+                for (int i = 0; i < decode.length; ++i)
+                {
+                    COSBase base = cosDecode.get(i);
+                    if (base instanceof COSNumber)
                     {
-                        LOG.warn(
-                                "decode array {} not compatible with color 
space, using the first two entries",
-                                cosDecode);
-                        return new float[]
-                        {
-                            decode0, decode1
-                        };
+                        decode[i] = ((COSNumber) base).floatValue();
+                    }
+                    else
+                    {
+                        error = true;
+                        break;
                     }
                 }
-                LOG.error("decode array {} not compatible with color space, 
using default",
-                        cosDecode);
-            }
-            else
-            {
-                decode = cosDecode.toFloatArray();
+                if (pdImage.isStencil() && (decode[0] < 0 || decode[0] > 1 || 
decode[1] < 0 || decode[1] > 1))
+                {
+                    error = true;
+                }
+                if (!error)
+                {
+                    return decode;
+                }
             }
         }
 
         // use color space default
-        if (decode == null)
-        {
-            return 
pdImage.getColorSpace().getDefaultDecode(pdImage.getBitsPerComponent());
-        }
-
-        return decode;
+        LOG.error("decode array {} not compatible with color space, using 
default", cosDecode);
+        return 
pdImage.getColorSpace().getDefaultDecode(pdImage.getBitsPerComponent());
     }
 }

Reply via email to