[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