diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2018-06-30 00:27:56 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2018-06-30 00:27:56 +0000 |
commit | 685b825b33c94a116f2f9fbe6470a012bf88e3c5 (patch) | |
tree | 39cb915b65da2182e7768e1d4707753d6add1868 /converter/other/pstopnm.c | |
parent | deb0c28cda1c479ef0a3b19be4726e633ded1d98 (diff) | |
download | netpbm-mirror-685b825b33c94a116f2f9fbe6470a012bf88e3c5.tar.gz netpbm-mirror-685b825b33c94a116f2f9fbe6470a012bf88e3c5.tar.xz netpbm-mirror-685b825b33c94a116f2f9fbe6470a012bf88e3c5.zip |
Fix divide-by-zero crash when computed resolution rounds down to zero dots per inch
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@3284 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'converter/other/pstopnm.c')
-rw-r--r-- | converter/other/pstopnm.c | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/converter/other/pstopnm.c b/converter/other/pstopnm.c index 15472721..d8e18e93 100644 --- a/converter/other/pstopnm.c +++ b/converter/other/pstopnm.c @@ -287,30 +287,56 @@ addPsToFileName(char const origFileName[], +static unsigned int +resolution(unsigned int const dotCt, + unsigned int const pointCt) { +/*---------------------------------------------------------------------------- + The resolution in dots per inch when 'dotCt' dots print 'pointCt' points + long. + + When this would round to zero, we return 1 dot per inch instead so it + doesn't play havoc with arithmetic - it's never going to happen unless + something is broken anyway. +-----------------------------------------------------------------------------*/ + return MAX(1, (unsigned int)((float)dotCt * 72 / pointCt + 0.5)); +} + + + static void computeSizeResFromSizeSpec(unsigned int const requestedXsize, unsigned int const requestedYsize, unsigned int const imageWidth, unsigned int const imageHeight, struct Dimensions * const imageDimP) { +/*---------------------------------------------------------------------------- + Compute output image size and assumed Postscript input resolution, assuming + user requested a specific size for at least one of the dimensions and the + input is 'imageWidth' x 'imageHeight' points. + + 'requestedXsize' is what the user requested for output image width in + pixels, or zero if he made no request. 'requestedYsize' is analogous + for the height. +-----------------------------------------------------------------------------*/ + assert(requestedXsize || requestedYsize); assert(imageWidth > 0); if (requestedXsize) { imageDimP->xsize = requestedXsize; - imageDimP->xres = (unsigned int) - (requestedXsize * 72 / imageWidth + 0.5); + imageDimP->xres = resolution(requestedXsize, imageWidth); if (!requestedYsize) { imageDimP->yres = imageDimP->xres; imageDimP->ysize = (unsigned int) (imageHeight * (float)imageDimP->yres/72 + 0.5); - } } + } + + assert(imageHeight > 0); if (requestedYsize) { imageDimP->ysize = requestedYsize; - imageDimP->yres = (unsigned int) - (requestedYsize * 72 / imageHeight + 0.5); + imageDimP->yres = resolution(requestedYsize, imageHeight); if (!requestedXsize) { imageDimP->xres = imageDimP->yres; imageDimP->xsize = (unsigned int) @@ -332,8 +358,9 @@ computeSizeResBlind(unsigned int const xmax, if (imageWidth == 0 || imageHeight == 0) { imageDimP->xres = imageDimP->yres = 72; } else { - imageDimP->xres = imageDimP->yres = MIN(xmax * 72 / imageWidth, - ymax * 72 / imageHeight); + imageDimP->xres = imageDimP->yres = + MIN(resolution(xmax, imageWidth), + resolution(ymax, imageHeight)); } if (nocrop) { @@ -677,6 +704,8 @@ writePstrans(struct Box const box, const char * pstrans; + assert(xres > 0); assert(yres > 0); + switch (orientation) { case PORTRAIT: { int llx, lly; @@ -1089,6 +1118,8 @@ main(int argc, char ** argv) { computeSizeRes(cmdline, borderedBox, &imageDim); + assert(imageDim.xres > 0); assert(imageDim.yres > 0); + outfileArg = computeOutfileArg(cmdline); ghostscriptDevice = |