[poppler] 2 commits - utils/pdfseparate.cc

Albert Astals Cid aacid at kemper.freedesktop.org
Wed Oct 23 16:05:57 PDT 2013


 utils/pdfseparate.cc |   60 +++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 44 insertions(+), 16 deletions(-)

New commits:
commit 9f09b9596f1fc52481914019d68c8f9b85b5c438
Merge: bd893d4 61f79b8
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Oct 24 01:03:02 2013 +0200

    Merge remote-tracking branch 'origin/poppler-0.24'

diff --cc utils/pdfseparate.cc
index 2844dc5,6424d20..924e5c7
--- a/utils/pdfseparate.cc
+++ b/utils/pdfseparate.cc
@@@ -55,6 -55,6 +56,12 @@@ bool extractPages (const char *srcFileN
      return false;
    }
  
++  // destFileName can have multiple %% and one %d
++  // We use auxDestFileName to replace all the valid % appearances
++  // by 'A' (random char that is not %), if at the end of replacing
++  // any of the valid appearances there is still any % around, the
++  // pattern is wrong
++  char *auxDestFileName = strdup(destFileName);
    if (firstPage == 0 && lastPage == 0) {
      firstPage = 1;
      lastPage = doc->getNumPages();
@@@ -63,25 -63,38 +70,46 @@@
      lastPage = doc->getNumPages();
    if (firstPage == 0)
      firstPage = 1;
-   if (firstPage != lastPage) {
-     bool foundmatch = false;
-     if (strstr(destFileName, "%d") != NULL) {
-       foundmatch = true;
-     } else {
-       char pattern[5];
-       for (int i = 2; i < 10; i++) {
-         sprintf(pattern, "%%0%dd", i);
-         if (strstr(destFileName, pattern) != NULL) {
-           foundmatch = true;
-           break;
-         }
 -  if (firstPage != lastPage && strstr(destFileName, "%d") == NULL) {
 -    error(errSyntaxError, -1, "'{0:s}' must contain '%d' if more than one page should be extracted", destFileName);
++  bool foundmatch = false;
++  char *p = strstr(auxDestFileName, "%d");
++  if (p != NULL) {
++    foundmatch = true;
++    *p = 'A';
++  } else {
++    char pattern[5];
++    for (int i = 2; i < 10; i++) {
++      sprintf(pattern, "%%0%dd", i);
++      p = strstr(auxDestFileName, pattern);
++      if (p != NULL) {
++       foundmatch = true;
++       *p = 'A';
++       break;
 +      }
 +    }
-     if (!foundmatch) {
-       error(errSyntaxError, -1, "'{0:s}' must contain '%%d' if more than one page should be extracted", destFileName);
-       return false;
-     }
 +  }
++  if (!foundmatch && firstPage != lastPage) {
++    error(errSyntaxError, -1, "'{0:s}' must contain '%%d' if more than one page should be extracted", destFileName);
++    free(auxDestFileName);
+     return false;
+   }
 -  
 -  // destFileName can have multiple %% and one %d
 -  // We use auxDestFileName to replace all the valid % appearances
 -  // by 'A' (random char that is not %), if at the end of replacing
 -  // any of the valid appearances there is still any % around, the
 -  // pattern is wrong
 -  char *auxDestFileName = strdup(destFileName);
 -  // %% can appear as many times as you want
 -  char *p = strstr(auxDestFileName, "%%");
++
++  // at this point auxDestFileName can only contain %%
++  p = strstr(auxDestFileName, "%%");
+   while (p != NULL) {
+     *p = 'A';
+     *(p + 1) = 'A';
+     p = strstr(p, "%%"); 
+   }
 -  // %d can appear only one time
 -  p = strstr(auxDestFileName, "%d");
 -  if (p != NULL) {
 -    *p = 'A';
 -  }
++
+   // at this point any other % is wrong
+   p = strstr(auxDestFileName, "%");
+   if (p != NULL) {
+     error(errSyntaxError, -1, "'{0:s}' can only contain one '%d' pattern", destFileName);
+     free(auxDestFileName);
+     return false;
+   }
+   free(auxDestFileName);
+   
    for (int pageNo = firstPage; pageNo <= lastPage; pageNo++) {
      snprintf (pathName, sizeof (pathName) - 1, destFileName, pageNo);
      GooString *gpageName = new GooString (pathName);
commit 61f79b8447c3ac8ab5a26e79e0c28053ffdccf75
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Oct 24 00:54:56 2013 +0200

    Allow only one %d in the filename
    
    Fixes crashes if you had %s and similar in the filename
    
    Inspired from patch by Pedro Ribeiro <pedrib at gmail.com>
    
    Bug #69434

diff --git a/utils/pdfseparate.cc b/utils/pdfseparate.cc
index 1d4901b..6424d20 100644
--- a/utils/pdfseparate.cc
+++ b/utils/pdfseparate.cc
@@ -20,6 +20,7 @@
 #include "PDFDoc.h"
 #include "ErrorCodes.h"
 #include "GlobalParams.h"
+#include <ctype.h>
 
 static int firstPage = 0;
 static int lastPage = 0;
@@ -63,9 +64,37 @@ bool extractPages (const char *srcFileName, const char *destFileName) {
   if (firstPage == 0)
     firstPage = 1;
   if (firstPage != lastPage && strstr(destFileName, "%d") == NULL) {
-    error(errSyntaxError, -1, "'{0:s}' must contain '%%d' if more than one page should be extracted", destFileName);
+    error(errSyntaxError, -1, "'{0:s}' must contain '%d' if more than one page should be extracted", destFileName);
     return false;
   }
+  
+  // destFileName can have multiple %% and one %d
+  // We use auxDestFileName to replace all the valid % appearances
+  // by 'A' (random char that is not %), if at the end of replacing
+  // any of the valid appearances there is still any % around, the
+  // pattern is wrong
+  char *auxDestFileName = strdup(destFileName);
+  // %% can appear as many times as you want
+  char *p = strstr(auxDestFileName, "%%");
+  while (p != NULL) {
+    *p = 'A';
+    *(p + 1) = 'A';
+    p = strstr(p, "%%"); 
+  }
+  // %d can appear only one time
+  p = strstr(auxDestFileName, "%d");
+  if (p != NULL) {
+    *p = 'A';
+  }
+  // at this point any other % is wrong
+  p = strstr(auxDestFileName, "%");
+  if (p != NULL) {
+    error(errSyntaxError, -1, "'{0:s}' can only contain one '%d' pattern", destFileName);
+    free(auxDestFileName);
+    return false;
+  }
+  free(auxDestFileName);
+  
   for (int pageNo = firstPage; pageNo <= lastPage; pageNo++) {
     snprintf (pathName, sizeof (pathName) - 1, destFileName, pageNo);
     GooString *gpageName = new GooString (pathName);


More information about the poppler mailing list