You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2016/03/01 18:40:49 UTC

svn commit: r1733115 - /pdfbox/branches/1.8/fontbox/src/main/java/org/apache/fontbox/ttf/HorizontalMetricsTable.java

Author: tilman
Date: Tue Mar  1 17:40:48 2016
New Revision: 1733115

URL: http://svn.apache.org/viewvc?rev=1733115&view=rev
Log:
PDFBOX-2428: apply 2.0 change to avoid EOException

Modified:
    pdfbox/branches/1.8/fontbox/src/main/java/org/apache/fontbox/ttf/HorizontalMetricsTable.java

Modified: pdfbox/branches/1.8/fontbox/src/main/java/org/apache/fontbox/ttf/HorizontalMetricsTable.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/fontbox/src/main/java/org/apache/fontbox/ttf/HorizontalMetricsTable.java?rev=1733115&r1=1733114&r2=1733115&view=diff
==============================================================================
--- pdfbox/branches/1.8/fontbox/src/main/java/org/apache/fontbox/ttf/HorizontalMetricsTable.java (original)
+++ pdfbox/branches/1.8/fontbox/src/main/java/org/apache/fontbox/ttf/HorizontalMetricsTable.java Tue Mar  1 17:40:48 2016
@@ -47,22 +47,39 @@ public class HorizontalMetricsTable exte
         int numHMetrics = hHeader.getNumberOfHMetrics();
         int numGlyphs = ttf.getNumberOfGlyphs();
         
+        int bytesRead = 0;
         advanceWidth = new int[ numHMetrics ];
         leftSideBearing = new short[ numHMetrics ];
         for( int i=0; i<numHMetrics; i++ )
         {
             advanceWidth[i] = data.readUnsignedShort();
             leftSideBearing[i] = data.readSignedShort();
+            bytesRead += 4;
         }
         
-        int numberNonHorizontal = numGlyphs - numHMetrics;
-        nonHorizontalLeftSideBearing = new short[ numberNonHorizontal ];
-        for( int i=0; i<numberNonHorizontal; i++ )
+        if (bytesRead < getLength())
         {
-            nonHorizontalLeftSideBearing[i] = data.readSignedShort();
+            int numberNonHorizontal = numGlyphs - numHMetrics;
+
+            // handle bad fonts with too many hmetrics
+            if (numberNonHorizontal < 0)
+            {
+                numberNonHorizontal = numGlyphs;
+            }
+
+            nonHorizontalLeftSideBearing = new short[numberNonHorizontal];
+            for (int i = 0; i < numberNonHorizontal; i++)
+            {
+                if (bytesRead < getLength())
+                {
+                    nonHorizontalLeftSideBearing[i] = data.readSignedShort();
+                    bytesRead += 2;
+                }
+            }
         }
         initialized = true;
     }
+
     /**
      * @return Returns the advanceWidth.
      */