diff options
Diffstat (limited to 'converter/other')
-rw-r--r-- | converter/other/pamtopfm.c | 2 | ||||
-rw-r--r-- | converter/other/xwdtopnm.c | 20 |
2 files changed, 19 insertions, 3 deletions
diff --git a/converter/other/pamtopfm.c b/converter/other/pamtopfm.c index 44a8ab08..ee44eeb5 100644 --- a/converter/other/pamtopfm.c +++ b/converter/other/pamtopfm.c @@ -279,7 +279,7 @@ main(int argc, char **argv ) { ifP = pm_openr(cmdline.inputFilespec); - tuplenArray = pnm_readpamn(ifP, &pam, sizeof(pam)); + tuplenArray = pnm_readpamn(ifP, &pam, PAM_STRUCT_SIZE(tuple_type)); writePfmHeader(stdout, makePfmHeader(&pam, cmdline.scale, cmdline.endian)); diff --git a/converter/other/xwdtopnm.c b/converter/other/xwdtopnm.c index 28c38cfc..4ff7d2ec 100644 --- a/converter/other/xwdtopnm.c +++ b/converter/other/xwdtopnm.c @@ -222,7 +222,15 @@ processX10Header(X10WDFileHeader * const h10P, /* Must be grayscale. */ *formatP = PGM_TYPE; *visualclassP = StaticGray; - *maxvalP = ( 1 << h10P->display_planes ) - 1; + if (h10P->display_planes > sizeof(*maxvalP) * 8 - 1) + pm_error("XWD header says display_planes = %u, which is " + "too large for this program to compute", + h10P->display_planes); + *maxvalP = ((xelval)1 << h10P->display_planes) - 1; + if (*maxvalP > PNM_OVERALLMAXVAL) + pm_error("XWD header says display_planes = %u, which is too " + "large for maximum maxval of %u", + h10P->display_planes, PNM_OVERALLMAXVAL); *colorsP = pnm_allocrow( *maxvalP + 1 ); for ( i = 0; i <= *maxvalP; ++i ) PNM_ASSIGN1( (*colorsP)[i], i ); @@ -520,7 +528,15 @@ processX11Header(X11WDFileHeader * const h11P, } else if ( *visualclassP == StaticGray ) { unsigned int i; *formatP = PGM_TYPE; - *maxvalP = ( 1 << h11FixedP->bits_per_pixel ) - 1; + if (h11FixedP->bits_per_pixel > sizeof(*maxvalP) * 8 - 1) + pm_error("XWD header says bits_per_pixel = %u, which is " + "too large for this program to compute", + h11FixedP->bits_per_pixel); + *maxvalP = ((xelval)1 << h11FixedP->bits_per_pixel) - 1; + if (*maxvalP > PNM_OVERALLMAXVAL) + pm_error("XWD header says bits_per_pixel = %u, which is too " + "large for maximum maxval of %u", + h11FixedP->bits_per_pixel, PNM_OVERALLMAXVAL); *colorsP = pnm_allocrow( *maxvalP + 1 ); for ( i = 0; i <= *maxvalP; ++i ) PNM_ASSIGN1( (*colorsP)[i], i ); |