On 19/04/12 08:18, Albert Astals Cid wrote: > You can do pdftohtml -c -dev 'jpeg /dev/null;cat /etc/passwd;#' > /path/to/some/pdf/fil and voila, you'll get your /etc/passwd printed > on screen > > Definitely not nice. > > This is because we are using plain system() to run the gs command and > it's easy to inject stuff there > > The poors man solution is trying to escape the strings but it's > really impossible. > > The real solution is moving to a fork+exec solution (path attached). > > The problem with that is that we loose support for platforms with > system() and without fork+exec (Windows). > > So here comes my question, anyone with Windows experience can > implement a path for my patch that works fine? > > Another solution would be just killing the gs invokation from > pdftohtml since i don't really see it's point. > > Comments?
I'm for option 3 - kill it off.
>From 7c3efcb930158a22cd19a0fbe4233242d578b3a9 Mon Sep 17 00:00:00 2001 From: Adrian Johnson <[email protected]> Date: Fri, 20 Apr 2012 19:40:04 +0930 Subject: [PATCH] pdftohtml: remove use of gs for rendering pages --- goo/gfile.cc | 8 ---- goo/gfile.h | 3 -- utils/pdftohtml.cc | 124 +++++++++++----------------------------------------- 3 files changed, 26 insertions(+), 109 deletions(-) diff --git a/goo/gfile.cc b/goo/gfile.cc index 7522424..7833502 100644 --- a/goo/gfile.cc +++ b/goo/gfile.cc @@ -545,14 +545,6 @@ GBool openTempFile(GooString **name, FILE **f, const char *mode) { #endif } -GBool executeCommand(char *cmd) { -#ifdef VMS - return system(cmd) ? gTrue : gFalse; -#else - return system(cmd) ? gFalse : gTrue; -#endif -} - #ifdef WIN32 GooString *fileNameToUTF8(char *path) { GooString *s; diff --git a/goo/gfile.h b/goo/gfile.h index d4b9082..34b85f0 100644 --- a/goo/gfile.h +++ b/goo/gfile.h @@ -104,9 +104,6 @@ extern time_t getModTime(char *fileName); // should be "w" or "wb". Returns true on success. extern GBool openTempFile(GooString **name, FILE **f, const char *mode); -// Execute <command>. Returns true on success. -extern GBool executeCommand(char *cmd); - #ifdef WIN32 // Convert a file name from Latin-1 to UTF-8. extern GooString *fileNameToUTF8(char *path); diff --git a/utils/pdftohtml.cc b/utils/pdftohtml.cc index d6475b0..a4b2eb6 100644 --- a/utils/pdftohtml.cc +++ b/utils/pdftohtml.cc @@ -75,7 +75,6 @@ GBool printHtml = gFalse; GBool complexMode=gFalse; GBool singleHtml=gFalse; // singleHtml GBool ignore=gFalse; -static GBool useSplash=gTrue; static char extension[5]="png"; static double scale=1.5; GBool noframes=gFalse; @@ -89,7 +88,6 @@ GBool showHidden = gFalse; GBool noMerge = gFalse; static char ownerPassword[33] = ""; static char userPassword[33] = ""; -static char gsDevice[33] = "none"; static GBool printVersion = gFalse; static GooString* getInfoString(Dict *infoDict, const char *key); @@ -132,8 +130,6 @@ static const ArgDesc argDesc[] = { "do not merge paragraphs"}, {"-enc", argString, textEncName, sizeof(textEncName), "output text encoding name"}, - {"-dev", argString, gsDevice, sizeof(gsDevice), - "output device name for Ghostscript (png16m, jpeg etc)"}, {"-fmt", argString, extension, sizeof(extension), "image file format for Splash output (png or jpg)"}, {"-v", argFlag, &printVersion, 0, @@ -181,18 +177,15 @@ int main(int argc, char *argv[]) { GooString *docTitle = NULL; GooString *author = NULL, *keywords = NULL, *subject = NULL, *date = NULL; GooString *htmlFileName = NULL; - GooString *psFileName = NULL; HtmlOutputDev *htmlOut = NULL; #ifdef HAVE_SPLASH SplashOutputDev *splashOut = NULL; #endif - PSOutputDev *psOut = NULL; GBool doOutline; GBool ok; char *p; GooString *ownerPW, *userPW; Object info; - const char * extsList[] = {"png", "jpeg", "bmp", "pcx", "tiff", "pbm", NULL}; // parse args ok = parseArgs(argDesc, &argc, argv); @@ -344,19 +337,6 @@ int main(int argc, char *argv[]) { info.free(); if( !docTitle ) docTitle = new GooString(htmlFileName); - if( strcmp("none", gsDevice) ) { - useSplash = gFalse; - /* determine extensions of output background images */ - int i; - for(i = 0; extsList[i]; i++) - { - if( strstr(gsDevice, extsList[i]) != (char *) NULL ) - { - strncpy(extension, extsList[i], sizeof(extension)); - break; - } - } - } #ifndef HAVE_SPLASH if( useSplash ) { @@ -421,87 +401,35 @@ int main(int argc, char *argv[]) { } if ((complexMode || singleHtml) && !xml && !ignore) { - if(useSplash) { #ifdef HAVE_SPLASH - GooString *imgFileName = NULL; - // White paper color - SplashColor color; - color[0] = color[1] = color[2] = 255; - // If the user specified "jpg" use JPEG, otherwise PNG - SplashImageFileFormat format = strcmp(extension, "jpg") ? - splashFormatPng : splashFormatJpeg; - - splashOut = new SplashOutputDevNoText(splashModeRGB8, 4, gFalse, color); - splashOut->startDoc(doc); - - for (int pg = firstPage; pg <= lastPage; ++pg) { - doc->displayPage(splashOut, pg, - 72 * scale, 72 * scale, - 0, gTrue, gFalse, gFalse); - SplashBitmap *bitmap = splashOut->getBitmap(); - - imgFileName = GooString::format("{0:s}{1:03d}.{2:s}", - htmlFileName->getCString(), pg, extension); - - bitmap->writeImgFile(format, imgFileName->getCString(), - 72 * scale, 72 * scale); - - delete imgFileName; - } + GooString *imgFileName = NULL; + // White paper color + SplashColor color; + color[0] = color[1] = color[2] = 255; + // If the user specified "jpg" use JPEG, otherwise PNG + SplashImageFileFormat format = strcmp(extension, "jpg") ? + splashFormatPng : splashFormatJpeg; + + splashOut = new SplashOutputDevNoText(splashModeRGB8, 4, gFalse, color); + splashOut->startDoc(doc); + + for (int pg = firstPage; pg <= lastPage; ++pg) { + doc->displayPage(splashOut, pg, + 72 * scale, 72 * scale, + 0, gTrue, gFalse, gFalse); + SplashBitmap *bitmap = splashOut->getBitmap(); + + imgFileName = GooString::format("{0:s}{1:03d}.{2:s}", + htmlFileName->getCString(), pg, extension); + + bitmap->writeImgFile(format, imgFileName->getCString(), + 72 * scale, 72 * scale); + + delete imgFileName; + } - delete splashOut; + delete splashOut; #endif - } else { - int h=xoutRound(htmlOut->getPageHeight()/scale); - int w=xoutRound(htmlOut->getPageWidth()/scale); - //int h=xoutRound(doc->getPageHeight(1)/scale); - //int w=xoutRound(doc->getPageWidth(1)/scale); - - psFileName = new GooString(htmlFileName->getCString()); - psFileName->append(".ps"); - - psOut = new PSOutputDev(psFileName->getCString(), doc, - NULL, firstPage, lastPage, psModePS, w, h); - psOut->setDisplayText(gFalse); - doc->displayPages(psOut, firstPage, lastPage, 72, 72, 0, - gTrue, gFalse, gFalse); - delete psOut; - - /*sprintf(buf, "%s -sDEVICE=png16m -dBATCH -dNOPROMPT -dNOPAUSE -r%d -sOutputFile=%s%%03d.png -g%dx%d -q %s", GHOSTSCRIPT, resolution, htmlFileName->getCString(), w, h, - psFileName->getCString());*/ - - GooString *gsCmd = new GooString(GHOSTSCRIPT); - GooString *tw, *th, *sc; - gsCmd->append(" -sDEVICE="); - gsCmd->append(gsDevice); - gsCmd->append(" -dBATCH -dNOPROMPT -dNOPAUSE -r"); - sc = GooString::fromInt(static_cast<int>(72*scale)); - gsCmd->append(sc); - gsCmd->append(" -sOutputFile="); - gsCmd->append("\""); - gsCmd->append(htmlFileName); - gsCmd->append("%03d."); - gsCmd->append(extension); - gsCmd->append("\" -g"); - tw = GooString::fromInt(static_cast<int>(scale*w)); - gsCmd->append(tw); - gsCmd->append("x"); - th = GooString::fromInt(static_cast<int>(scale*h)); - gsCmd->append(th); - gsCmd->append(" -q \""); - gsCmd->append(psFileName); - gsCmd->append("\""); - // printf("running: %s\n", gsCmd->getCString()); - if( !executeCommand(gsCmd->getCString()) && !errQuiet) { - error(errIO, -1, "Failed to launch Ghostscript!\n"); - } - unlink(psFileName->getCString()); - delete tw; - delete th; - delete sc; - delete gsCmd; - delete psFileName; - } } delete htmlOut; -- 1.7.9.5
_______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
