diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2015-05-17 23:45:07 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2015-05-17 23:45:07 +0000 |
commit | 8d0a594e5934661e81dbd0080b9f1e0831be96b5 (patch) | |
tree | 4ca5f65ef2e63b3d5f4c314c7ebd19cc5a75c2f0 /converter | |
parent | d629cd04b9cc107c525262a1c498a4f520f31144 (diff) | |
download | netpbm-mirror-8d0a594e5934661e81dbd0080b9f1e0831be96b5.tar.gz netpbm-mirror-8d0a594e5934661e81dbd0080b9f1e0831be96b5.tar.xz netpbm-mirror-8d0a594e5934661e81dbd0080b9f1e0831be96b5.zip |
Fix bug: segfault with zero width image
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@2492 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'converter')
-rw-r--r-- | converter/pbm/pbmtoxbm.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/converter/pbm/pbmtoxbm.c b/converter/pbm/pbmtoxbm.c index 4c5b19bc..bb41d174 100644 --- a/converter/pbm/pbmtoxbm.c +++ b/converter/pbm/pbmtoxbm.c @@ -23,6 +23,7 @@ #define _BSD_SOURCE 1 /* Make sure strdup() is in string.h */ #define _XOPEN_SOURCE 500 /* Make sure strdup() is in string.h */ +#include <assert.h> #include <string.h> #include "pm_c_util.h" @@ -243,18 +244,22 @@ puttermX10(void) { unsigned int i; + assert(itemCnt % 2 == 0); + for (i = 0; i < itemCnt; i += 2) { int rc; + assert(i + 1 < itemCnt); + rc = printf("%s0x%02x%02x%s", (i == 0) ? " " : "", itemBuff[i+1], itemBuff[i], - (i == itemCnt - 2) ? "};\n" : ","); + (i + 2 >= itemCnt) ? "" : ","); if (rc < 0) - pm_error("Error writing end of X10 bitmap raster. " + pm_error("Error writing Item %u of X10 bitmap raster. " "printf() failed with errno %d (%s)", - errno, strerror(errno)); + i, errno, strerror(errno)); } } @@ -271,12 +276,12 @@ puttermX11(void) { rc = printf("%s0x%02x%s", (i == 0) ? " " : "", itemBuff[i], - (i == itemCnt - 1) ? "};\n" : ","); + (i + 1 >= itemCnt) ? "" : ","); if (rc < 0) - pm_error("Error writing end of X11 bitmap raster. " + pm_error("Error writing Item %u of X11 bitmap raster. " "printf() failed with errno %d (%s)", - errno, strerror(errno)); + i, errno, strerror(errno)); } } @@ -298,6 +303,17 @@ putterm(void) { case X10: puttermX10(); break; case X11: puttermX11(); break; } + + { + int rc; + + rc = printf("};\n"); + + if (rc < 0) + pm_error("Error writing end of X11 bitmap raster. " + "printf() failed with errno %d (%s)", + errno, strerror(errno)); + } } @@ -309,8 +325,8 @@ writeXbmHeader(enum xbmVersion const xbmVersion, unsigned int const height, FILE * const ofP) { - printf("#define %s_width %d\n", name, width); - printf("#define %s_height %d\n", name, height); + printf("#define %s_width %u\n", name, width); + printf("#define %s_height %u\n", name, height); printf("static %s %s_bits[] = {\n", xbmVersion == X10 ? "short" : "char", name); @@ -339,7 +355,6 @@ convertRaster(FILE * const ifP, putinit(xbmVersion); bitrow = pbm_allocrow_packed(cols + padright); - bitrow[bitrowBytes-1] = 0; for (row = 0; row < rows; ++row) { unsigned int i; @@ -347,6 +362,10 @@ convertRaster(FILE * const ifP, pbm_readpbmrow_packed(ifP, bitrow, cols, format); pbm_cleanrowend_packed(bitrow, cols); + if (padright >= 8) { + assert(bitrowBytes > 0); + bitrow[bitrowBytes-1] = 0x00; + } for (i = 0; i < bitrowBytes; ++i) putitem(bitrow[i]); } |