Author: msahyoun
Date: Thu Feb 22 17:34:45 2018
New Revision: 1825083

URL: http://svn.apache.org/viewvc?rev=1825083&view=rev
Log:
PDFBOX-4122: add test where index data could be null - malformed CFF only; 
throw IOException if Top DICT INDEX could not be read, return EmptyCharset if 
CharStrings index could not be read

Modified:
    pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java

Modified: 
pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java?rev=1825083&r1=1825082&r2=1825083&view=diff
==============================================================================
--- pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java 
(original)
+++ pdfbox/trunk/fontbox/src/main/java/org/apache/fontbox/cff/CFFParser.java 
Thu Feb 22 17:34:45 2018
@@ -25,6 +25,11 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.lang.model.util.ElementScanner6;
+
 import org.apache.fontbox.util.Charsets;
 
 /**
@@ -33,6 +38,11 @@ import org.apache.fontbox.util.Charsets;
  */
 public class CFFParser
 {
+    /**
+     * Log instance.
+     */
+    private static final Log LOG = LogFactory.getLog(CFFParser.class);
+
     private static final String TAG_OTTO = "OTTO";
     private static final String TAG_TTCF = "ttcf";
     private static final String TAG_TTFONLY = "\u0000\u0001\u0000\u0000";
@@ -103,6 +113,11 @@ public class CFFParser
             throw new IOException("Name index missing in CFF font");
         }
         byte[][] topDictIndex = readIndexData(input);
+        if (topDictIndex == null)
+        {
+            throw new IOException("Top DICT INDEX missing in CFF font");
+        }
+        
         stringIndex = readStringIndexData(input);
         byte[][] globalSubrIndex = readIndexData(input);
 
@@ -471,18 +486,27 @@ public class CFFParser
             {
                 charset = CFFExpertSubsetCharset.getInstance();
             }
-            else
+            else if (charStringsIndex != null)
             {
                 input.setPosition(charsetId);
                 charset = readCharset(input, charStringsIndex.length, 
isCIDFont);
             }
+            // that should not happen
+            else
+            {
+                LOG.debug("Couldn't read CharStrings index - returning empty 
charset instead");
+                charset = new EmptyCharset(0);
+            }
+            
         }
         else
         {
             if (isCIDFont)
             {
+                // CharStrings index could be null if the index data couldnÄt 
be read
+                int numEntries = charStringsIndex == null ? 0 :  
charStringsIndex.length;
                 // a CID font with no charset does not default to any 
predefined charset
-                charset = new EmptyCharset(charStringsIndex.length);
+                charset = new EmptyCharset(numEntries);
             }
             else
             {


Reply via email to