From 4058312aeebf6e1fad96950e37ebb9f7b341a37b Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Fri, 25 May 2018 16:40:50 +0100 Subject: [PATCH 1/2] fix a TGA ping crash see https://github.com/jcupitt/libvips/issues/980 --- ChangeLog | 1 + configure.ac | 11 +++++++++++ libvips/foreign/magick2vips.c | 13 +++++++++++++ 3 files changed, 25 insertions(+) diff --git a/ChangeLog b/ChangeLog index ff1abeb6..401eb1ff 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ - revise C++ example [fangqiao] - strict round down on jpeg shrink on load [davidwood] - configure test for g++ 7.2 and composite.cpp +- fix a crash with TGA ping [jtorresfabra] 12/2/18 started 8.6.3 - use pkg-config to find libjpeg, if we can diff --git a/configure.ac b/configure.ac index daea29d6..a2f1cf3e 100644 --- a/configure.ac +++ b/configure.ac @@ -662,6 +662,17 @@ if test x"$magick6" = x"yes"; then LIBS="$save_LIBS" fi +if test x"$magick6" = x"yes"; then + # more recent magick6s have AcquireImageColormap rather than + # AllocateImageColormap groan + save_LIBS="$LIBS" + LIBS="$LIBS $MAGICK_LIBS" + AC_CHECK_FUNCS(AcquireImageColormap, + AC_DEFINE(HAVE_ACQUIREIMAGECOLORMAP,1, + [define if your magick has AcquireImageColormap.])) + LIBS="$save_LIBS" +fi + if test x"$magick6" = x"yes"; then # more recent magicks have GetVirtualPixels rather than GetImagePixels save_LIBS="$LIBS" diff --git a/libvips/foreign/magick2vips.c b/libvips/foreign/magick2vips.c index f0fa26aa..160560d1 100644 --- a/libvips/foreign/magick2vips.c +++ b/libvips/foreign/magick2vips.c @@ -335,6 +335,19 @@ parse_header( Read *read ) if( (im->Bands = get_bands( image )) < 0 ) return( -1 ); + /* Some ImageMagick loaders (eg. TGA) fail to set the ->colormap + * field on Ping. GetImageChannelDepth() needs this and + * will crash if it's not set. + * + * If there's no colormap, set an empty one. + */ + if( !image->colormap ) +#ifdef HAVE_ACQUIREIMAGECOLORMAP + AcquireImageColormap( image, image->colors ); +#else /*!HAVE_ACQUIREIMAGECOLORMAP*/ + AllocateImageColormap( image, image->colors ); +#endif /*HAVE_ACQUIREIMAGECOLORMAP*/ + /* Depth can be 'fractional'. * * You'd think we should use From 7e95ae514da0f22eca302999e75ca06500d50e0d Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Tue, 29 May 2018 19:29:11 +0100 Subject: [PATCH 2/2] don't use ping in magickload too unreliable, sadly --- ChangeLog | 2 +- configure.ac | 11 ----------- libvips/foreign/magick2vips.c | 18 +++--------------- 3 files changed, 4 insertions(+), 27 deletions(-) diff --git a/ChangeLog b/ChangeLog index 401eb1ff..8f9fbdfc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,7 +3,7 @@ - revise C++ example [fangqiao] - strict round down on jpeg shrink on load [davidwood] - configure test for g++ 7.2 and composite.cpp -- fix a crash with TGA ping [jtorresfabra] +- don't Ping in magickload, too unreliable 12/2/18 started 8.6.3 - use pkg-config to find libjpeg, if we can diff --git a/configure.ac b/configure.ac index a2f1cf3e..daea29d6 100644 --- a/configure.ac +++ b/configure.ac @@ -662,17 +662,6 @@ if test x"$magick6" = x"yes"; then LIBS="$save_LIBS" fi -if test x"$magick6" = x"yes"; then - # more recent magick6s have AcquireImageColormap rather than - # AllocateImageColormap groan - save_LIBS="$LIBS" - LIBS="$LIBS $MAGICK_LIBS" - AC_CHECK_FUNCS(AcquireImageColormap, - AC_DEFINE(HAVE_ACQUIREIMAGECOLORMAP,1, - [define if your magick has AcquireImageColormap.])) - LIBS="$save_LIBS" -fi - if test x"$magick6" = x"yes"; then # more recent magicks have GetVirtualPixels rather than GetImagePixels save_LIBS="$LIBS" diff --git a/libvips/foreign/magick2vips.c b/libvips/foreign/magick2vips.c index 160560d1..d65290c3 100644 --- a/libvips/foreign/magick2vips.c +++ b/libvips/foreign/magick2vips.c @@ -335,19 +335,6 @@ parse_header( Read *read ) if( (im->Bands = get_bands( image )) < 0 ) return( -1 ); - /* Some ImageMagick loaders (eg. TGA) fail to set the ->colormap - * field on Ping. GetImageChannelDepth() needs this and - * will crash if it's not set. - * - * If there's no colormap, set an empty one. - */ - if( !image->colormap ) -#ifdef HAVE_ACQUIREIMAGECOLORMAP - AcquireImageColormap( image, image->colors ); -#else /*!HAVE_ACQUIREIMAGECOLORMAP*/ - AllocateImageColormap( image, image->colors ); -#endif /*HAVE_ACQUIREIMAGECOLORMAP*/ - /* Depth can be 'fractional'. * * You'd think we should use @@ -808,7 +795,7 @@ vips__magick_read_header( const char *filename, printf( "vips__magick_read_header: pinging image ...\n" ); #endif /*DEBUG*/ - read->image = PingImage( read->image_info, &read->exception ); + read->image = ReadImage( read->image_info, &read->exception ); if( !read->image ) { vips_error( "magick2vips", _( "unable to ping file " "\"%s\"\nlibMagick error: %s %s" ), @@ -885,7 +872,8 @@ vips__magick_read_buffer_header( const void *buf, const size_t len, printf( "vips__magick_read_buffer_header: pinging blob ...\n" ); #endif /*DEBUG*/ - read->image = PingBlob( read->image_info, buf, len, &read->exception ); + read->image = BlobToImage( read->image_info, + buf, len, &read->exception ); if( !read->image ) { vips_error( "magick2vips", _( "unable to ping blob\n" "libMagick error: %s %s" ),