From 61f79b8447c3ac8ab5a26e79e0c28053ffdccf75 Mon Sep 17 00:00:00 2001 From: Albert Astals Cid Date: Wed, 23 Oct 2013 22:54:56 +0000 Subject: Allow only one %d in the filename Fixes crashes if you had %s and similar in the filename Inspired from patch by Pedro Ribeiro 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 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); -- cgit v0.9.0.2-2-gbebe