diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2021-11-07 01:33:26 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2021-11-07 01:33:26 +0000 |
commit | 42efa67c47521596088768d82f5665b15d03d6bf (patch) | |
tree | 358e75c107ff9ef1a45e3f4a15085d1f3f7a7a42 /converter/other/sunicontopnm.c | |
parent | 109fb3ec30eaca9ce3427d58a2b8fb1c038a7c4f (diff) | |
download | netpbm-mirror-42efa67c47521596088768d82f5665b15d03d6bf.tar.gz netpbm-mirror-42efa67c47521596088768d82f5665b15d03d6bf.tar.xz netpbm-mirror-42efa67c47521596088768d82f5665b15d03d6bf.zip |
fix arithmetic overflows
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@4177 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'converter/other/sunicontopnm.c')
-rw-r--r-- | converter/other/sunicontopnm.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/converter/other/sunicontopnm.c b/converter/other/sunicontopnm.c index eff1be58..93ddc0ab 100644 --- a/converter/other/sunicontopnm.c +++ b/converter/other/sunicontopnm.c @@ -12,10 +12,12 @@ /* Most icon images are monochrome: Depth=1 + Depth=8 images are extremely rare. At least some of these are color - images but we can't tell the palette color order. + images but we haven't found information on the palette color order. Output will be in pgm. Convert to ppm with pgmtoppm or pamlookup - if necessary. + if necessary. It is up to the user to provide the color palette in + a form acceptable by the above conversion utilities. */ #include <assert.h> @@ -28,9 +30,9 @@ static void -ReadIconFileHeader(FILE * const file, - int * const widthP, - int * const heightP, +ReadIconFileHeader(FILE * const file, + int * const widthP, + int * const heightP, int * const depthP, int * const bitsPerItemP) { @@ -49,7 +51,7 @@ ReadIconFileHeader(FILE * const file, ch == ' ') ; for (i = 0; - ch != '=' && ch != ',' && ch != '\n' && ch != '\t' && + ch != '=' && ch != ',' && ch != '\n' && ch != '\t' && ch != ' ' && (i < (sizeof(variable) - 1)); ++i) { variable[i] = ch; @@ -82,7 +84,7 @@ ReadIconFileHeader(FILE * const file, } else if (streq(variable, "Valid_bits_per_item")) { if (value != 16 && value !=32) pm_error("invalid Valid_bits_per_item"); - *bitsPerItemP = value; + *bitsPerItemP = value; ++fieldCt; } } @@ -93,12 +95,19 @@ ReadIconFileHeader(FILE * const file, if (*widthP <= 0) pm_error("invalid width (must be positive): %d", *widthP); + else if (*widthP % 8 > 0) + pm_message("warning: width not a multiple of 8: %d", *widthP); + /* We don't know whether widths which are not a multiple of 8 + are allowed. The program must gracefully handle this case + because sun icon files are easy to edit by hand. + */ if (*heightP <= 0) pm_error("invalid height (must be positive): %d", *heightP); } + int main(int argc, const char ** argv) { @@ -125,7 +134,7 @@ main(int argc, const char ** argv) { maxval = 1; pbm_writepbminit(stdout, cols, rows, 0); bitrow = pbm_allocrow_packed(cols); - colChars = cols / 8; + colChars = pbm_packed_bytes(cols); } else { assert(depth == 8); format = PGM_TYPE; @@ -156,7 +165,7 @@ main(int argc, const char ** argv) { else grayrow[colChar] = data; } else - pm_error("error scanning bits item %u" , colChar); + pm_error("error scanning bits item %u", colChar); } /* output row */ @@ -166,6 +175,11 @@ main(int argc, const char ** argv) { pgm_writepgmrow(stdout, grayrow, cols, maxval, 0); } + if (format == PBM_TYPE) + pbm_freerow_packed(bitrow); + else + pgm_freerow(grayrow); + pm_close(ifP); pm_close(stdout); return 0; |