2e1d9e
From d2f5d424ba8752f9a9e9dad410546ec1b46caa0a Mon Sep 17 00:00:00 2001
2e1d9e
From: Adam Reichold <adam.reichold@t-online.de>
2e1d9e
Date: Tue, 6 Nov 2018 09:08:06 +0100
2e1d9e
Subject: [PATCH] pdfdetach: Check for valid file name of embedded file before
2e1d9e
 using it to determine save path.
2e1d9e
2e1d9e
Closes #660
2e1d9e
---
2e1d9e
 utils/pdfdetach.cc | 24 ++++++++++++++++++------
2e1d9e
 1 file changed, 18 insertions(+), 6 deletions(-)
2e1d9e
2e1d9e
diff --git a/utils/pdfdetach.cc b/utils/pdfdetach.cc
2e1d9e
index a8720c64..71fa8608 100644
2e1d9e
--- a/utils/pdfdetach.cc
2e1d9e
+++ b/utils/pdfdetach.cc
2e1d9e
@@ -191,14 +191,18 @@ int main(int argc, char *argv[]) {
2e1d9e
       fileSpec = static_cast<FileSpec *>(embeddedFiles->get(i));
2e1d9e
       printf("%d: ", i+1);
2e1d9e
       s1 = fileSpec->getFileName();
2e1d9e
-      if ((s1->getChar(0) & 0xff) == 0xfe && (s1->getChar(1) & 0xff) == 0xff) {
2e1d9e
+      if (!s1) {
2e1d9e
+	exitCode = 3;
2e1d9e
+	goto err2;
2e1d9e
+      }
2e1d9e
+      if (s1->hasUnicodeMarker()) {
2e1d9e
         isUnicode = gTrue;
2e1d9e
         j = 2;
2e1d9e
       } else {
2e1d9e
         isUnicode = gFalse;
2e1d9e
         j = 0;
2e1d9e
       }
2e1d9e
-      while (j < fileSpec->getFileName()->getLength()) {
2e1d9e
+      while (j < s1->getLength()) {
2e1d9e
         if (isUnicode) {
2e1d9e
           u = ((s1->getChar(j) & 0xff) << 8) | (s1->getChar(j+1) & 0xff);
2e1d9e
           j += 2;
2e1d9e
@@ -228,14 +232,18 @@ int main(int argc, char *argv[]) {
2e1d9e
 	p = path;
2e1d9e
       }
2e1d9e
       s1 = fileSpec->getFileName();
2e1d9e
-      if ((s1->getChar(0) & 0xff) == 0xfe && (s1->getChar(1) & 0xff) == 0xff) {
2e1d9e
+      if (!s1) {
2e1d9e
+	exitCode = 3;
2e1d9e
+	goto err2;
2e1d9e
+      }
2e1d9e
+      if (s1->hasUnicodeMarker()) {
2e1d9e
         isUnicode = gTrue;
2e1d9e
         j = 2;
2e1d9e
       } else {
2e1d9e
         isUnicode = gFalse;
2e1d9e
         j = 0;
2e1d9e
       }
2e1d9e
-      while (j < fileSpec->getFileName()->getLength()) {
2e1d9e
+      while (j < s1->getLength()) {
2e1d9e
         if (isUnicode) {
2e1d9e
           u = ((s1->getChar(j) & 0xff) << 8) | (s1->getChar(j+1) & 0xff);
2e1d9e
           j += 2;
2e1d9e
@@ -276,14 +284,18 @@ int main(int argc, char *argv[]) {
2e1d9e
     } else {
2e1d9e
       p = path;
2e1d9e
       s1 = fileSpec->getFileName();
2e1d9e
-      if ((s1->getChar(0) & 0xff) == 0xfe && (s1->getChar(1) & 0xff) == 0xff) {
2e1d9e
+      if (!s1) {
2e1d9e
+	exitCode = 3;
2e1d9e
+	goto err2;
2e1d9e
+      }
2e1d9e
+      if (s1->hasUnicodeMarker()) {
2e1d9e
         isUnicode = gTrue;
2e1d9e
         j = 2;
2e1d9e
       } else {
2e1d9e
         isUnicode = gFalse;
2e1d9e
         j = 0;
2e1d9e
       }
2e1d9e
-      while (j < fileSpec->getFileName()->getLength()) {
2e1d9e
+      while (j < s1->getLength()) {
2e1d9e
         if (isUnicode) {
2e1d9e
           u = ((s1->getChar(j) & 0xff) << 8) | (s1->getChar(j+1) & 0xff);
2e1d9e
           j += 2;
2e1d9e
-- 
2e1d9e
2.19.1
2e1d9e