From 466cbae99a69f4551726cd43adaf213e9d060f9e Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Fri, 7 Jan 2011 23:33:32 +0100 Subject: [PATCH] Fix some resource leaks in ImageMagick image loader * src/image.c (imagemagick_load_image): Fix some resource leaks and error handling. --- src/ChangeLog | 5 +++++ src/image.c | 30 +++++++++++++++++++++--------- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 7fb63964b6..d4283dffff 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2011-01-07 Andreas Schwab + + * image.c (imagemagick_load_image): Fix some resource leaks and + error handling. + 2011-01-07 Chong Yidong * fns.c (Fyes_or_no_p): Accept format string args. diff --git a/src/image.c b/src/image.c index edfa208dd2..fd1b921056 100644 --- a/src/image.c +++ b/src/image.c @@ -1,7 +1,7 @@ /* Functions for image support on window system. Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 - Free Software Foundation, Inc. + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, + 2011 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -7561,9 +7561,15 @@ imagemagick_load_image (/* Pointer to emacs frame structure. */ exception = AcquireExceptionInfo (); im_image = ReadImage (image_info, exception); - CatchException (exception); + DestroyExceptionInfo (exception); - image_wand = NewMagickWandFromImage (im_image); + if (im_image != NULL) + { + image_wand = NewMagickWandFromImage (im_image); + status = MagickTrue; + } + else + status = MagickFalse; } else { @@ -7666,11 +7672,6 @@ imagemagick_load_image (/* Pointer to emacs frame structure. */ width, height, and then transfer ownerwship to Emacs. */ height = MagickGetImageHeight (image_wand); width = MagickGetImageWidth (image_wand); - if (status == MagickFalse) - { - image_error ("Imagemagick image get size failed", Qnil, Qnil); - goto imagemagick_error; - } if (! check_image_size (f, width, height)) { @@ -7690,6 +7691,9 @@ imagemagick_load_image (/* Pointer to emacs frame structure. */ if (!x_create_x_image_and_pixmap (f, width, height, 0, &ximg, &img->pixmap)) { +#ifdef COLOR_TABLE_SUPPORT + free_color_table (); +#endif image_error("Imagemagick X bitmap allocation failure", Qnil, Qnil); goto imagemagick_error; } @@ -7702,6 +7706,10 @@ imagemagick_load_image (/* Pointer to emacs frame structure. */ iterator = NewPixelIterator (image_wand); if (iterator == (PixelIterator *) NULL) { +#ifdef COLOR_TABLE_SUPPORT + free_color_table (); +#endif + x_destroy_x_image (ximg); image_error ("Imagemagick pixel iterator creation failed", Qnil, Qnil); goto imagemagick_error; @@ -7736,6 +7744,9 @@ imagemagick_load_image (/* Pointer to emacs frame structure. */ if (!x_create_x_image_and_pixmap (f, width, height, imagedepth, &ximg, &img->pixmap)) { +#ifdef COLOR_TABLE_SUPPORT + free_color_table (); +#endif image_error("Imagemagick X bitmap allocation failure", Qnil, Qnil); goto imagemagick_error; } @@ -7798,6 +7809,7 @@ imagemagick_load_image (/* Pointer to emacs frame structure. */ return 1; imagemagick_error: + DestroyMagickWand (image_wand); /* TODO more cleanup. */ image_error ("Error parsing IMAGEMAGICK image `%s'", img->spec, Qnil); return 0; -- 2.20.1