# HG changeset patch # User Andreas Schwab # Date 1294439612 -3600 # Node ID f87a5809d0c254d8f31e20ae5d12faa14e554583 # Parent 5ba6192ecf75c9a97ddbd1b72d466467d7b40c9d Fix some resource leaks in ImageMagick image loader * src/image.c (imagemagick_load_image): Fix some resource leaks and error handling. diff -r 5ba6192ecf75 -r f87a5809d0c2 src/ChangeLog --- a/src/ChangeLog Fri Jan 07 12:43:33 2011 -0800 +++ b/src/ChangeLog Fri Jan 07 23:33:32 2011 +0100 @@ -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 -r 5ba6192ecf75 -r f87a5809d0c2 src/image.c --- a/src/image.c Fri Jan 07 12:43:33 2011 -0800 +++ b/src/image.c Fri Jan 07 23:33:32 2011 +0100 @@ -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 @@ exception = AcquireExceptionInfo (); im_image = ReadImage (image_info, exception); - CatchException (exception); - - image_wand = NewMagickWandFromImage (im_image); + DestroyExceptionInfo (exception); + + if (im_image != NULL) + { + image_wand = NewMagickWandFromImage (im_image); + status = MagickTrue; + } + else + status = MagickFalse; } else { @@ -7666,11 +7672,6 @@ 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 @@ 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 @@ 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 @@ 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 @@ return 1; imagemagick_error: + DestroyMagickWand (image_wand); /* TODO more cleanup. */ image_error ("Error parsing IMAGEMAGICK image `%s'", img->spec, Qnil); return 0;