You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2016/01/24 19:38:37 UTC

svn commit: r1726531 - in /pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos: COSFloat.java COSNumber.java

Author: lehmi
Date: Sun Jan 24 18:38:37 2016
New Revision: 1726531

URL: http://svn.apache.org/viewvc?rev=1726531&view=rev
Log:
PDFBOX-3116: check MIN/MAX values of the given number and replace them if to out of bounds

Modified:
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSNumber.java

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java?rev=1726531&r1=1726530&r2=1726531&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java Sun Jan 24 18:38:37 2016
@@ -56,6 +56,7 @@ public class COSFloat extends COSNumber
         {
             valueAsString = aFloat; 
             value = new BigDecimal( valueAsString );
+            checkMinMaxValues();
         }
         catch( NumberFormatException e )
         {
@@ -67,6 +68,7 @@ public class COSFloat extends COSNumber
                 {
                     valueAsString = "-0.00000" + aFloat.substring(8);
                     value = new BigDecimal(valueAsString);
+                    checkMinMaxValues();
                 }
                 catch (NumberFormatException e2)
                 {
@@ -93,6 +95,38 @@ public class COSFloat extends COSNumber
         valueAsString = removeNullDigits(value.toPlainString());
     }
 
+    private void checkMinMaxValues()
+    {
+        float floatValue = value.floatValue();
+        double doubleValue = value.doubleValue();
+        boolean valueReplaced = false;
+        // check for huge values
+        if (floatValue == Float.NEGATIVE_INFINITY  || floatValue == Float.POSITIVE_INFINITY )
+        {
+            
+            if (Math.abs(doubleValue) > Float.MAX_VALUE)
+            {
+                floatValue = Float.MAX_VALUE * (floatValue == Float.POSITIVE_INFINITY ? 1 : -1);
+                valueReplaced = true;
+            }
+        }
+        // check for very small values
+        else if (floatValue == 0 && doubleValue != 0)
+        {
+            if (Math.abs(doubleValue) < Float.MIN_VALUE )
+            {
+                floatValue = Float.MIN_VALUE;
+                floatValue *= doubleValue >= 0  ? 1 : -1;
+                valueReplaced = true;
+            }
+        }
+        if (valueReplaced)
+        {
+            value = new BigDecimal(floatValue);
+            valueAsString = removeNullDigits(value.toPlainString());
+        }
+    }
+
     private String removeNullDigits(String value)
     {
         // remove fraction digit "0" only

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSNumber.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSNumber.java?rev=1726531&r1=1726530&r2=1726531&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSNumber.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/cos/COSNumber.java Sun Jan 24 18:38:37 2016
@@ -108,7 +108,8 @@ public abstract class COSNumber extends
             }
             catch( NumberFormatException e )
             {
-                throw new IOException( "Value is not an integer: " + number );
+                // might be a huge number, see PDFBOX-3116
+                return new COSFloat(number);
             }
         } 
         else