From: Cristy Date: Sun, 23 Sep 2018 19:54:34 +0000 (-0400) Subject: ... X-Git-Tag: 7.0.8-13~89 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6068f8f7a7e21ef64b1d2eed1c4089d35561bb47;p=imagemagick ... --- diff --git a/coders/jpeg.c b/coders/jpeg.c index 020ffaac6..8faf68c92 100644 --- a/coders/jpeg.c +++ b/coders/jpeg.c @@ -105,6 +105,7 @@ #define IPTC_MARKER (JPEG_APP0+13) #define XML_MARKER (JPEG_APP0+1) #define MaxBufferExtent 16384 +#define MaxJPEGScans 1024 /* Typedef declarations. @@ -334,6 +335,29 @@ static void JPEGErrorHandler(j_common_ptr jpeg_info) longjmp(error_manager->error_recovery,1); } +static void JPEGProgressHandler(j_common_ptr jpeg_info) +{ + ErrorManager + *error_manager; + + ExceptionInfo + *exception; + + Image + *image; + + error_manager=(ErrorManager *) jpeg_info->client_data; + image=error_manager->image; + exception=error_manager->exception; + if (jpeg_info->is_decompressor == 0) + return; + if (((j_decompress_ptr) jpeg_info)->input_scan_number < MaxJPEGScans) + return; + (void) ThrowMagickException(exception,GetMagickModule(),CorruptImageError, + "too many scans","`%s'",image->filename); + longjmp(error_manager->error_recovery,1); +} + static MagickBooleanType JPEGWarningHandler(j_common_ptr jpeg_info,int level) { #define JPEGExcessiveWarnings 1000 @@ -1071,6 +1095,9 @@ static Image *ReadJPEGImage(const ImageInfo *image_info, struct jpeg_error_mgr jpeg_error; + struct jpeg_progress_mgr + jpeg_progress; + register JSAMPLE *p; @@ -1110,6 +1137,7 @@ static Image *ReadJPEGImage(const ImageInfo *image_info, (void) memset(&error_manager,0,sizeof(error_manager)); (void) memset(&jpeg_info,0,sizeof(jpeg_info)); (void) memset(&jpeg_error,0,sizeof(jpeg_error)); + (void) memset(&jpeg_progress,0,sizeof(jpeg_progress)); jpeg_info.err=jpeg_std_error(&jpeg_error); jpeg_info.err->emit_message=(void (*)(j_common_ptr,int)) JPEGWarningHandler; jpeg_info.err->error_exit=(void (*)(j_common_ptr)) JPEGErrorHandler; @@ -1131,6 +1159,8 @@ static Image *ReadJPEGImage(const ImageInfo *image_info, jpeg_create_decompress(&jpeg_info); if (GetMaxMemoryRequest() != ~0UL) jpeg_info.mem->max_memory_to_use=(long) GetMaxMemoryRequest(); + jpeg_progress.progress_monitor=(void (*)(j_common_ptr)) JPEGProgressHandler; + jpeg_info.progress=(&jpeg_progress); JPEGSourceManager(&jpeg_info,image); jpeg_set_marker_processor(&jpeg_info,JPEG_COM,ReadComment); option=GetImageOption(image_info,"profile:skip");