From ff64ef0243e57b18a73368e8132bd214a28ca378 Mon Sep 17 00:00:00 2001
From: Jonas Jenwald <jonas.jenwald@gmail.com>
Date: Sun, 8 Nov 2015 13:18:23 +0100
Subject: [PATCH] Prevent `readCmapTable` from failing if the `cmap` is missing
 in TrueType fonts

Fixes http://arrow.dit.ie/cgi/viewcontent.cgi?article=1000&context=aaschadpoth#page=3.
---
 src/core/fonts.js                   |   9 +++++++++
 test/pdfs/.gitignore                |   1 +
 test/pdfs/TrueType_without_cmap.pdf | Bin 0 -> 3989 bytes
 test/test_manifest.json             |   7 +++++++
 4 files changed, 17 insertions(+)
 create mode 100644 test/pdfs/TrueType_without_cmap.pdf

diff --git a/src/core/fonts.js b/src/core/fonts.js
index cd9c34f46..b04fbdc57 100644
--- a/src/core/fonts.js
+++ b/src/core/fonts.js
@@ -3226,6 +3226,15 @@ var Font = (function FontClosure() {
        * PDF spec
        */
       function readCmapTable(cmap, font, isSymbolicFont, hasEncoding) {
+        if (!cmap) {
+          warn('No cmap table available.');
+          return {
+            platformId: -1,
+            encodingId: -1,
+            mappings: [],
+            hasShortCmap: false
+          };
+        }
         var segment;
         var start = (font.start ? font.start : 0) + cmap.offset;
         font.pos = start;
diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore
index 7bad8e6b0..cd4ec0205 100644
--- a/test/pdfs/.gitignore
+++ b/test/pdfs/.gitignore
@@ -2,6 +2,7 @@
 *.error
 
 !tracemonkey.pdf
+!TrueType_without_cmap.pdf
 !franz.pdf
 !franz_2.pdf
 !xref_command_missing.pdf
diff --git a/test/pdfs/TrueType_without_cmap.pdf b/test/pdfs/TrueType_without_cmap.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..0cfad2da81e422146ad75567b908c9503203ecda
GIT binary patch
literal 3989
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
R@*s&|SH)>-Gi)t!{{ap;pW^@k

literal 0
HcmV?d00001

diff --git a/test/test_manifest.json b/test/test_manifest.json
index 825b5c8c6..c40cfcd43 100644
--- a/test/test_manifest.json
+++ b/test/test_manifest.json
@@ -1196,6 +1196,13 @@
        "rounds": 1,
        "type": "eq"
     },
+    {  "id": "TrueType_without_cmap",
+       "file": "pdfs/TrueType_without_cmap.pdf",
+       "md5": "afca8bb11f2e1f7298b4e5dd85785fb0",
+       "link": false,
+       "rounds": 1,
+       "type": "eq"
+    },
     {  "id": "issue3323",
        "file": "pdfs/issue3323.pdf",
        "md5": "1a14ff574013caeafa9d598269988764",