From 8d0a594e5934661e81dbd0080b9f1e0831be96b5 Mon Sep 17 00:00:00 2001 From: giraffedata Date: Sun, 17 May 2015 23:45:07 +0000 Subject: 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 --- converter/pbm/pbmtoxbm.c | 37 ++++++++++++++++++++++++++++--------- 1 file 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 #include #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]); } -- cgit 1.4.1