]> granicus.if.org Git - imagemagick/commitdiff
...
authorCristy <urban-warrior@imagemagick.org>
Sun, 23 Sep 2018 19:54:34 +0000 (15:54 -0400)
committerCristy <urban-warrior@imagemagick.org>
Sun, 23 Sep 2018 19:54:34 +0000 (15:54 -0400)
coders/jpeg.c

index 020ffaac692d8a81533fff594468f9d151d662bb..8faf68c9275a360843e7b6563b40fc7fbec945d3 100644 (file)
 #define IPTC_MARKER  (JPEG_APP0+13)
 #define XML_MARKER  (JPEG_APP0+1)
 #define MaxBufferExtent  16384
+#define MaxJPEGScans  1024
 \f
 /*
   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");