improve error catch and avoid mem leak when encode anim webp fail
diff --git a/coders/webp.c b/coders/webp.c
index ef43c1d..3aa0f2b 100644
--- a/coders/webp.c
+++ b/coders/webp.c
@@ -761,11 +761,6 @@
}
#endif
-typedef struct PictureMemory {
- MemoryInfo *pixel_info;
- struct PictureMemory *next;
-} PictureMemory;
-
static const char * WebPErrorCodeMessage(WebPEncodingError error_code)
{
switch (error_code)
@@ -925,41 +920,66 @@
WebPPicture
picture;
+ MagickBooleanType
+ status = MagickTrue;
+
+ first_image=CoalesceImages(image,exception);
+ image=first_image;
+ if (first_image == (Image *) NULL)
+ return(MagickFalse);
+
WebPAnimEncoderOptionsInit(&enc_options);
if (image_info->verbose)
enc_options.verbose = 1;
enc=WebPAnimEncoderNew((int) image->page.width,(int) image->page.height,
&enc_options);
- first_image=CoalesceImages(image,exception);
- image=first_image;
-
while (image != NULL)
{
- if (WebPPictureInit(&picture) == 0)
- ThrowWriterException(ResourceLimitError,"UnableToEncodeImageFile");
+ status=(MagickBooleanType)WebPPictureInit(&picture);
+ if (!status)
+ {
+ (void) ThrowMagickException(exception,GetMagickModule(),
+ ResourceLimitError,"UnableToEncodeImageFile","`%s'",image->filename);
+ break;
+ }
- WriteSingleWEBPPicture(image_info,image,configure,&picture,exception);
- WebPAnimEncoderAdd(enc,&picture,(int) frame_timestamp,configure);
+ status=WriteSingleWEBPPicture(image_info,image,configure,&picture,exception);
+ if (!status)
+ break;
+
+ status=(MagickBooleanType)WebPAnimEncoderAdd(enc,&picture,(int) frame_timestamp,configure);
WebPPictureFree(&picture);
-
- if (WebPAnimEncoderGetError(enc) && strlen(WebPAnimEncoderGetError(enc)))
- ThrowWriterException(CoderError, WebPAnimEncoderGetError(enc));
+ if (!status)
+ {
+ (void) ThrowMagickException(exception,GetMagickModule(),
+ CoderError,WebPAnimEncoderGetError(enc),"`%s'",image->filename);
+ break;
+ }
effective_delta = image->delay*1000/image->ticks_per_second;
if (effective_delta < 10)
effective_delta = 100; /* Consistent with gif2webp */
frame_timestamp+=effective_delta;
- image = GetNextImageInList(image);
+ image=GetNextImageInList(image);
}
- WebPAnimEncoderAdd(enc,NULL,(int) frame_timestamp,configure);
- WebPAnimEncoderAssemble(enc,webp_data);
+ if(status)
+ {
+ // add last null frame and assemble picture.
+ status=(MagickBooleanType)WebPAnimEncoderAdd(enc,NULL,(int) frame_timestamp,configure);
+ if(status)
+ status=(MagickBooleanType)WebPAnimEncoderAssemble(enc,webp_data);
+
+ if (!status)
+ (void) ThrowMagickException(exception,GetMagickModule(),
+ CoderError,WebPAnimEncoderGetError(enc),"`%s'",image->filename);
+ }
WebPAnimEncoderDelete(enc);
DestroyImageList(first_image);
- return(MagickTrue);
+ return(status);
}
static MagickBooleanType WriteWEBPImageProfile(Image *image,WebPData *webp_data,ExceptionInfo *exception)