diff --git a/wrlib/jpeg.c b/wrlib/jpeg.c index b1cef8bf..19720572 100644 --- a/wrlib/jpeg.c +++ b/wrlib/jpeg.c @@ -133,6 +133,11 @@ RLoadJPEG(RContext *context, char *file_name, int index) jpeg_read_header(&cinfo, TRUE); + if (cinfo.image_width < 1 || cinfo.image_height < 1) { + RErrorCode = RERR_BADIMAGEFILE; + goto bye; + } + bptr = buffer[0] = (JSAMPROW)malloc(cinfo.image_width*cinfo.num_components); if (!buffer[0]) { RErrorCode = RERR_NOMEMORY; diff --git a/wrlib/nxpm.c b/wrlib/nxpm.c index 8fcfc10a..aa1dcb63 100644 --- a/wrlib/nxpm.c +++ b/wrlib/nxpm.c @@ -86,7 +86,7 @@ RGetImageFromXPMData(RContext *context, char **data) int w, h, ccount, csize; if (sscanf(data[line++], "%i %i %i %i", &w, &h, &ccount, &csize)!=4 - || w <= 0 || h <= 0 || ccount <= 0 || csize <= 0) + || w <= 1 || h <= 1 || ccount <= 0 || csize <= 0) goto bad_format; if (csize!=1 && csize!=2) diff --git a/wrlib/png.c b/wrlib/png.c index e814ee35..28349d02 100644 --- a/wrlib/png.c +++ b/wrlib/png.c @@ -112,6 +112,15 @@ RLoadPNG(RContext *context, char *file, int index) png_get_IHDR(png, pinfo, &width, &height, &depth, &color_type, &junk, &junk, &junk); + + /* sanity check */ + if (width < 1 || height < 1) { + fclose(f); + png_destroy_read_struct(&png, &pinfo, &einfo); + RErrorCode = RERR_BADIMAGEFILE; + return NULL; + } + /* check for an alpha channel */ if (png_get_valid(png, pinfo, PNG_INFO_tRNS)) diff --git a/wrlib/ppm.c b/wrlib/ppm.c index 1e2a381e..65749292 100644 --- a/wrlib/ppm.c +++ b/wrlib/ppm.c @@ -154,7 +154,7 @@ RLoadPPM(RContext *context, char *file_name, int index) } /* get size */ - if (sscanf(buffer, "%i %i", &w, &h)!=2) + if (sscanf(buffer, "%i %i", &w, &h)!=2 || w < 1 || h < 1) goto bad_file;