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 13:17:55 UTC

svn commit: r1726482 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos: COSFloat.java COSNumber.java

Author: lehmi
Date: Sun Jan 24 12:17:53 2016
New Revision: 1726482

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

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

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java?rev=1726482&r1=1726481&r2=1726482&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSFloat.java Sun Jan 24 12:17:53 2016
@@ -57,6 +57,7 @@ public class COSFloat extends COSNumber
         {
             valueAsString = aFloat; 
             value = new BigDecimal( valueAsString );
+            checkMinMaxValues();
         }
         catch( NumberFormatException e )
         {
@@ -68,6 +69,7 @@ public class COSFloat extends COSNumber
                 {
                     valueAsString = "-0.00000" + aFloat.substring(8);
                     value = new BigDecimal(valueAsString);
+                    checkMinMaxValues();
                 }
                 catch (NumberFormatException e2)
                 {
@@ -80,7 +82,39 @@ public class COSFloat extends COSNumber
             }
         }
     }
-
+    
+    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 *= 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_NORMAL )
+            {
+                floatValue = Float.MIN_NORMAL;
+                floatValue *= doubleValue >= 0  ? 1 : -1;
+                valueReplaced = true;
+            }
+        }
+        if (valueReplaced)
+        {
+            value = new BigDecimal(floatValue);
+            valueAsString = removeNullDigits(value.toPlainString());
+        }
+    }
+    
     private String removeNullDigits(String plainStringValue)
     {
         // remove fraction digit "0" only

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSNumber.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSNumber.java?rev=1726482&r1=1726481&r2=1726482&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSNumber.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSNumber.java Sun Jan 24 12:17:53 2016
@@ -107,14 +107,7 @@ public abstract class COSNumber extends
             catch( NumberFormatException e )
             {
                 // might be a huge number, see PDFBOX-3116
-                try
-                {
-                    return new COSFloat(number);
-                }
-                catch (NumberFormatException e2)
-                {
-                    throw new IOException("Not a number: " + number, e2);
-                }
+                return new COSFloat(number);
             }
         } 
         else