public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] repo/gentoo:master commit in: media-libs/libafterimage/files/, media-libs/libafterimage/
@ 2017-01-17 22:35 Andrew Savchenko
  0 siblings, 0 replies; only message in thread
From: Andrew Savchenko @ 2017-01-17 22:35 UTC (permalink / raw
  To: gentoo-commits

commit:     1565ff5da7b321093f3b6e72597bee214c7c08f2
Author:     Andrew Savchenko <bircoph <AT> gentoo <DOT> org>
AuthorDate: Tue Jan 17 22:35:23 2017 +0000
Commit:     Andrew Savchenko <bircoph <AT> gentoo <DOT> org>
CommitDate: Tue Jan 17 22:35:23 2017 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=1565ff5d

media-libs/libafterimage: fix invalid casts, see bug 571654

Fix invalid pointer usage as pointed out by Oliver Freyermuth
<o.freyermuth <AT> googlemail.com>, bug 571654, comment 23 which may
lead to ROOT crash (comment 22).
Patch by  Oliver Freyermuth, comment 24.

Also fix pointer signedness issue in import.c:2227.

Package-Manager: Portage-2.3.3, Repoman-2.3.1
Signed-off-by: Andrew Savchenko <bircoph <AT> gentoo.org>

 .../files/libafterimage-giflib5-v2.patch           | 391 +++++++++++++++++++++
 .../libafterimage/libafterimage-1.20-r2.ebuild     | 108 ++++++
 2 files changed, 499 insertions(+)

diff --git a/media-libs/libafterimage/files/libafterimage-giflib5-v2.patch b/media-libs/libafterimage/files/libafterimage-giflib5-v2.patch
new file mode 100644
index 00000000..85afd53
--- /dev/null
+++ b/media-libs/libafterimage/files/libafterimage-giflib5-v2.patch
@@ -0,0 +1,391 @@
+diff -Naurd libAfterImage-1.20.orig/export.c libAfterImage-1.20/export.c
+--- libAfterImage-1.20.orig/export.c	2016-05-01 11:44:19.000000000 +0300
++++ libAfterImage-1.20/export.c	2016-05-02 10:57:59.688984491 +0300
+@@ -1048,6 +1048,9 @@
+ 	Bool new_image = True ;
+ 	START_TIME(started);
+ 	int cmap_size = 1;
++#if (GIFLIB_MAJOR>=5)
++	int errcode;
++#endif
+ #define GIF_NETSCAPE_EXT_BYTES 3
+ 	unsigned char netscape_ext_bytes[GIF_NETSCAPE_EXT_BYTES] = { 0x1, 0x0, 0x0};
+ #define GIF_GCE_BYTES 4	
+@@ -1086,10 +1089,18 @@
+ 
+ 	while( cmap_size < 256 && cmap_size < (int)cmap.count+(gce_bytes[0]&0x01) )
+ 		cmap_size = cmap_size<<1 ;
++#if (GIFLIB_MAJOR>=5)
++	if( (gif_cmap = GifMakeMapObject(cmap_size, NULL )) == NULL )
++#else
+ 	if( (gif_cmap = MakeMapObject(cmap_size, NULL )) == NULL )
++#endif
+ 	{
+ 		free( mapped_im );
++#if (GIFLIB_MAJOR>=5)
++		ASIM_PrintGifError(E_GIF_ERR_NOT_ENOUGH_MEM);
++#else
+ 		ASIM_PrintGifError();
++#endif
+ 		return False;
+ 	}
+ 	memcpy( &(gif_cmap->Colors[0]), &(cmap.entries[0]), MIN(cmap.count,(unsigned int)cmap_size)*3 );
+@@ -1101,13 +1112,25 @@
+ 		SavedImage *images = NULL ;
+ 		int count = 0 ;
+ 		/* TODO: do something about multiimage files !!! */
++#if (GIFLIB_MAJOR>=5)
++		gif = open_gif_read(infile, &errcode);
++#else
+ 		gif = open_gif_read(infile);
++#endif
+ 		if( gif == NULL || get_gif_saved_images(gif, -1, &images, &count) == GIF_ERROR)
+ 		{
++#if (GIFLIB_MAJOR>=5)
++			ASIM_PrintGifError(errcode);
++#else
+ 			ASIM_PrintGifError();
++#endif
+ 			if( gif )
+ 			{
++#if (GIFLIB_MAJOR>=5)
++				DGifCloseFile(gif, &errcode);
++#else
+ 				DGifCloseFile(gif);
++#endif
+ 				gif = NULL ;
+ 			}
+ 			if (infile)
+@@ -1123,14 +1146,22 @@
+ 			gif_src = *gif ;
+ 			gif->SColorMap = NULL ;
+ 			gif->Image.ColorMap = NULL ;
++#if (GIFLIB_MAJOR>=5)
++            DGifCloseFile(gif, &errcode);
++#else
+ 			DGifCloseFile(gif);
++#endif
+ 			gif = NULL;
+ 			fclose (infile);
+ 			infile = NULL;
+ 			outfile = open_writeable_image_file( path );
+ 
+ 			if (outfile)
++#if (GIFLIB_MAJOR>=5)
++				gif = EGifOpenFileHandle(fileno(outfile), &errcode);
++#else
+ 				gif = EGifOpenFileHandle(fileno(outfile));
++#endif
+ 				
+ 			if (gif)
+ 			{
+@@ -1141,26 +1172,46 @@
+ 									   gif_src.SColorMap )) == GIF_OK )
+ 					status = write_gif_saved_images( gif, images, count );
+ 				if( status != GIF_OK )
++#if (GIFLIB_MAJOR>=5)
++					ASIM_PrintGifError(status);
++#else
+ 					ASIM_PrintGifError();
++#endif
+ 			}
+ 			if (gif_src.SColorMap)
+ 			{  /* we only want to save private colormap if it is any different from
+ 			    * screen colormap ( saves us  768 bytes per image ) */
+ 				if( gif_cmap->ColorCount == gif_src.SColorMap->ColorCount )
+ 					dont_save_cmap = ( memcmp( gif_cmap->Colors, gif_src.SColorMap->Colors, gif_cmap->ColorCount*sizeof(GifColorType)) == 0 );
++#if (GIFLIB_MAJOR>=5)
++				GifFreeMapObject(gif_src.SColorMap);
++#else
+ 				FreeMapObject(gif_src.SColorMap);
++#endif
+ 			}
+ 			if (gif)
+ 			{
+ 				EGifPutExtension(gif, GRAPHICS_EXT_FUNC_CODE, GIF_GCE_BYTES, &(gce_bytes[0]));
+ 				if( get_flags( params->gif.flags, EXPORT_ANIMATION_REPEATS ) )
+ 				{
++#if (GIFLIB_MAJOR>=5)
++					EGifPutExtensionLeader(gif, APPLICATION_EXT_FUNC_CODE);
++					EGifPutExtensionBlock(gif, 11, "NETSCAPE2.0");
++					EGifPutExtensionBlock(gif, GIF_NETSCAPE_EXT_BYTES, &(netscape_ext_bytes[0]));
++					EGifPutExtensionTrailer(gif);
++#else
+ 					EGifPutExtensionFirst(gif, APPLICATION_EXT_FUNC_CODE, 11, "NETSCAPE2.0");
+ 					EGifPutExtensionLast(gif, 0, GIF_NETSCAPE_EXT_BYTES, &(netscape_ext_bytes[0]));
++#endif
+ 				}
+ 				
++#if (GIFLIB_MAJOR>=5)
++				if( (errcode = EGifPutImageDesc(gif, 0, 0, im->width, im->height, false, (dont_save_cmap)?NULL:gif_cmap )) == GIF_ERROR )
++					ASIM_PrintGifError(errcode);
++#else
+ 				if( EGifPutImageDesc(gif, 0, 0, im->width, im->height, FALSE, (dont_save_cmap)?NULL:gif_cmap ) == GIF_ERROR )
+ 					ASIM_PrintGifError();
++#endif
+ 			}
+ 		}
+ 		free_gif_saved_images( images, count );
+@@ -1172,24 +1223,46 @@
+ 			outfile = open_writeable_image_file(path);
+ 			
+ 		if (outfile)
++        {
++#if (GIFLIB_MAJOR>=5)
++			gif = EGifOpenFileHandle(fileno(outfile), &errcode);
++			if (errcode != E_GIF_SUCCEEDED)
++				ASIM_PrintGifError(errcode);
++#else
+ 			if ((gif = EGifOpenFileHandle(fileno(outfile))) == NULL)
+ 				ASIM_PrintGifError();
++#endif
++        }
+ 	}
+ 
+ 	if( new_image && gif )
+ 	{
++#if (GIFLIB_MAJOR>=5)
++		if( (errcode = EGifPutScreenDesc(gif, im->width, im->height, cmap_size, 0, gif_cmap )) == GIF_ERROR )
++			ASIM_PrintGifError(errcode);
++#else
+ 		if( EGifPutScreenDesc(gif, im->width, im->height, cmap_size, 0, gif_cmap ) == GIF_ERROR )
+ 			ASIM_PrintGifError();
++#endif
+ 	
+ 		EGifPutExtension(gif, 0xf9, GIF_GCE_BYTES, &(gce_bytes[0]));
+ 	
++#if (GIFLIB_MAJOR>=5)
++		if( (errcode = EGifPutImageDesc(gif, 0, 0, im->width, im->height, false, NULL )) == GIF_ERROR )
++			ASIM_PrintGifError(errcode);
++#else
+ 		if( EGifPutImageDesc(gif, 0, 0, im->width, im->height, FALSE, NULL ) == GIF_ERROR )
+ 			ASIM_PrintGifError();
++#endif
+ 	}
+ 
+ 	if( gif_cmap )
+ 	{
++#if (GIFLIB_MAJOR>=5)
++		GifFreeMapObject(gif_cmap);
++#else
+ 		FreeMapObject(gif_cmap);
++#endif
+ 		gif_cmap = NULL ;
+ 	}
+ 	if( gif )
+@@ -1203,12 +1276,23 @@
+ 			register int *src = mapped_im + x*y;
+ 	  	    while( --x >= 0 )
+ 	  			row_pointer[x] = src[x] ;
++#if (GIFLIB_MAJOR>=5)
++			if( (errcode = EGifPutLine(gif, row_pointer, im->width))  == GIF_ERROR)
++				ASIM_PrintGifError(errcode);
++#else
+ 			if( EGifPutLine(gif, row_pointer, im->width)  == GIF_ERROR)
+ 				ASIM_PrintGifError();
++#endif
+ 		}
+ 		free( row_pointer );
++#if (GIFLIB_MAJOR>=5)
++		EGifCloseFile(gif, &errcode);
++		if (errcode != E_GIF_SUCCEEDED)
++			ASIM_PrintGifError(errcode);
++#else
+ 		if (EGifCloseFile(gif) == GIF_ERROR)
+ 			ASIM_PrintGifError();
++#endif
+ 		gif = NULL;
+ 	}
+ 	free( mapped_im );
+diff -Naurd libAfterImage-1.20.orig/import.c libAfterImage-1.20/import.c
+--- libAfterImage-1.20.orig/import.c	2016-05-01 11:44:19.000000000 +0300
++++ libAfterImage-1.20/import.c	2016-05-02 11:01:58.979496755 +0300
+@@ -2178,6 +2178,9 @@
+ 	int  		transparent = -1 ;
+ 	unsigned int  		y;
+ 	unsigned int		width = 0, height = 0;
++#if (GIFLIB_MAJOR>=5)
++	int errcode;
++#endif
+ 	ColorMapObject     *cmap = NULL ;
+ 
+ 	START_TIME(started);
+@@ -2186,7 +2189,11 @@
+ 	
+ 	if ((fp = open_image_file(path)) == NULL)
+ 		return NULL;
++#if (GIFLIB_MAJOR>=5)
++	if( (gif = open_gif_read(fp, &errcode)) != NULL )
++#else
+ 	if( (gif = open_gif_read(fp)) != NULL )
++#endif
+ 	{
+ 		SavedImage	*sp = NULL ;
+ 		int count = 0 ;
+@@ -2224,7 +2224,7 @@
+ 												   		((((unsigned int) sp->ExtensionBlocks[y].Bytes[GIF_GCE_DELAY_BYTE_HIGH])<<8)&0x00FF00);
+ 					}else if(  sp->ExtensionBlocks[y].Function == APPLICATION_EXT_FUNC_CODE && sp->ExtensionBlocks[y].ByteCount == 11 ) /* application extension */
+ 					{
+-						if( strncmp(&(sp->ExtensionBlocks[y].Bytes[0]), "NETSCAPE2.0", 11 ) == 0 ) 
++						if( strncmp((const char*)(&sp->ExtensionBlocks[y].Bytes[0]), "NETSCAPE2.0", 11 ) == 0 ) 
+ 						{
+ 							++y ;
+ 							if( y < (unsigned int)sp->ExtensionBlockCount && sp->ExtensionBlocks[y].ByteCount == 3 )
+@@ -2289,13 +2296,21 @@
+ 			}
+ 			free_gif_saved_images( sp, count );
+ 		}else if( status != GIF_OK ) 
++#if (GIFLIB_MAJOR>=5)
++			ASIM_PrintGifError(status);
++#else
+ 			ASIM_PrintGifError();
++#endif
+ 		else if( params->subimage == -1 )
+ 			show_error( "Image file \"%s\" does not have any valid image information.", path );
+ 		else
+ 			show_error( "Image file \"%s\" does not have subimage %d.", path, params->subimage );
+ 
++#if (GIFLIB_MAJOR>=5)
++		DGifCloseFile(gif, &errcode);
++#else
+ 		DGifCloseFile(gif);
++#endif
+ 		fclose( fp );
+ 	}
+ 	SHOW_TIME("image loading",started);
+diff -Naurd libAfterImage-1.20.orig/ungif.c libAfterImage-1.20/ungif.c
+--- libAfterImage-1.20.orig/ungif.c	2011-01-15 08:52:22.000000000 +0300
++++ libAfterImage-1.20/ungif.c	2016-05-02 16:03:57.590148737 +0300
+@@ -75,13 +75,21 @@
+ 	if( sp )
+ 	{
+ 		if (sp->ImageDesc.ColorMap)
++#if (GIFLIB_MAJOR>=5)
++	    	GifFreeMapObject(sp->ImageDesc.ColorMap);
++#else
+ 	    	FreeMapObject(sp->ImageDesc.ColorMap);
++#endif
+ 
+ 		if (sp->RasterBits)
+ 		    free((char *)sp->RasterBits);
+ 
+ 		if (sp->ExtensionBlocks)
++#if (GIFLIB_MAJOR>=5)
++		    GifFreeExtensions(&sp->ExtensionBlockCount, &sp->ExtensionBlocks);
++#else
+ 		    FreeExtension(sp);
++#endif
+ 
+ 		if( !reusable )
+ 			free( sp );
+@@ -119,11 +127,19 @@
+ 	return ret;
+ }
+ 
++#if (GIFLIB_MAJOR>=5)
++GifFileType*
++open_gif_read( FILE *in_stream, int *errcode )
++{
++	return DGifOpen(in_stream, fread_gif, errcode);
++}
++#else
+ GifFileType*
+ open_gif_read( FILE *in_stream )
+ {
+ 	return DGifOpen(in_stream, fread_gif);
+ }
++#endif
+ 
+ int
+ get_gif_image_desc( GifFileType *gif, SavedImage *im )
+@@ -151,7 +167,11 @@
+ 		memcpy( &(im->ImageDesc), &(gif->Image), sizeof(GifImageDesc));
+ 		if( gif->Image.ColorMap )
+ 		{
++#if (GIFLIB_MAJOR>=5)
++			im->ImageDesc.ColorMap = GifMakeMapObject(gif->Image.ColorMap->ColorCount, NULL);
++#else
+ 			im->ImageDesc.ColorMap = MakeMapObject(gif->Image.ColorMap->ColorCount, NULL);
++#endif
+ 			fseek( gif->UserData, start_pos+9, SEEK_SET ); 
+ 			fread( im->ImageDesc.ColorMap->Colors, 1, gif->Image.ColorMap->ColorCount*3, gif->UserData);
+ 			fseek( gif->UserData, end_pos, SEEK_SET );
+@@ -166,6 +186,9 @@
+ {
+     GifRecordType RecordType;
+     GifByteType *ExtData;
++#if (GIFLIB_MAJOR>=5)
++    int ExtCode;
++#endif
+     SavedImage temp_save;
+ 	int curr_image = 0, ret_count = *ret_images ;
+ 	int status = GIF_OK;
+@@ -197,13 +220,23 @@
+ 				break;
+ 
+ 	    	case EXTENSION_RECORD_TYPE:
++#if (GIFLIB_MAJOR>=5)
++				status = DGifGetExtension(gif,&ExtCode,&ExtData);
++#else
+ 				status = DGifGetExtension(gif,&temp_save.Function,&ExtData);
++#endif
+ 				while (ExtData != NULL && status == GIF_OK )
+ 				{
+             		/* Create an extension block with our data */
++#if (GIFLIB_MAJOR>=5)
++            		if ((status = GifAddExtensionBlock(&temp_save.ExtensionBlockCount, &temp_save.ExtensionBlocks,
++                            ExtCode, sizeof(ExtData), ExtData)) == GIF_OK)
++                    status = DGifGetExtension(gif,&ExtCode,&ExtData);
++#else
+             		if ((status = AddExtensionBlock(&temp_save, ExtData[0], (char*)&(ExtData[1]))) == GIF_OK)
+ 				    	status = DGifGetExtensionNext(gif, &ExtData);
+             		temp_save.Function = 0;
++#endif
+ 				}
+ 				break;
+ 
+diff -Naurd libAfterImage-1.20.orig/ungif.h libAfterImage-1.20/ungif.h
+--- libAfterImage-1.20.orig/ungif.h	2011-01-15 08:52:22.000000000 +0300
++++ libAfterImage-1.20/ungif.h	2016-05-02 10:57:59.715983533 +0300
+@@ -7,11 +7,29 @@
+ extern "C" {
+ #endif
+ 
++#if ((GIFLIB_MAJOR==4) && (GIFLIB_MINOR>=2)) 
++static inline void PrintGifError(void) {
++    fprintf(stderr, "%s\n", GifErrorString());
++}
++#elif (GIFLIB_MAJOR>=5)
++static inline void PrintGifError(int code) {
++    fprintf(stderr, "%s\n", GifErrorString(code));
++}
++#endif
++
++#if (GIFLIB_MAJOR>=5)
++#ifdef __GNUC__
++#define ASIM_PrintGifError(code) do{ fprintf( stderr, "%s():%d:<%s> ",__FUNCTION__, __LINE__, path?path:"null" ); PrintGifError(code); }while(0)
++#else
++#define ASIM_PrintGifError(code) do{ PrintGifError(code); }while(0)
++#endif
++#else // (GIFLIB_MAJOR>=5)
+ #ifdef __GNUC__
+ #define ASIM_PrintGifError() do{ fprintf( stderr, "%s():%d:<%s> ",__FUNCTION__, __LINE__, path?path:"null" ); PrintGifError(); }while(0)
+ #else
+ #define ASIM_PrintGifError() do{ PrintGifError(); }while(0)
+ #endif
++#endif // (GIFLIB_MAJOR>=5)
+ 
+ #define GIF_GCE_DELAY_BYTE_LOW	1
+ #define GIF_GCE_DELAY_BYTE_HIGH	2
+@@ -24,7 +42,11 @@
+ 
+ 
+ int fread_gif( GifFileType *gif, GifByteType* buf, int len );
++#if (GIFLIB_MAJOR>=5)
++GifFileType* open_gif_read( FILE *in_stream, int *errcode );
++#else
+ GifFileType* open_gif_read( FILE *in_stream );
++#endif
+ 
+ int get_gif_image_desc( GifFileType *gif, SavedImage *im );
+ 

diff --git a/media-libs/libafterimage/libafterimage-1.20-r2.ebuild b/media-libs/libafterimage/libafterimage-1.20-r2.ebuild
new file mode 100644
index 00000000..3b73b63
--- /dev/null
+++ b/media-libs/libafterimage/libafterimage-1.20-r2.ebuild
@@ -0,0 +1,108 @@
+# Copyright 1999-2017 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=6
+inherit autotools
+
+MY_PN=libAfterImage
+
+DESCRIPTION="Afterstep's standalone generic image manipulation library"
+HOMEPAGE="http://www.afterstep.org/afterimage/index.php"
+SRC_URI="ftp://ftp.afterstep.org/stable/${MY_PN}/${MY_PN}-${PV}.tar.bz2"
+
+LICENSE="LGPL-2.1"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~hppa ~ia64 ~ppc ~ppc64 ~sparc ~x86 ~x86-fbsd ~amd64-linux ~x86-linux"
+IUSE="+X cpu_flags_x86_mmx examples gif jpeg nls opengl png static-libs shm +shaping svg tiff truetype"
+
+RDEPEND="
+	X?		( x11-libs/libSM
+			  x11-libs/libXext
+			  x11-libs/libXrender )
+	gif?	( media-libs/giflib:0= )
+	jpeg?	( virtual/jpeg:0 )
+	opengl?	( virtual/opengl )
+	png?	( >=media-libs/libpng-1.4:0= )
+	svg?	( gnome-base/librsvg:2 )
+	tiff?	( media-libs/tiff:0 )
+	truetype? ( media-libs/freetype )"
+DEPEND="${RDEPEND}
+	X?		( x11-proto/xextproto )
+	virtual/pkgconfig
+	!!x11-wm/afterstep"
+REQUIRED_USE="
+	opengl?	 ( X )
+	shaping? ( X )
+	shm?	 ( X )"
+
+S="${WORKDIR}/${MY_PN}-${PV}"
+
+src_prepare() {
+	default
+
+	# fix some ldconfig problem in makefile.in
+	eapply -p0 "${FILESDIR}"/${PN}-makefile.in.patch
+	# fix lib paths in afterimage-config
+	eapply -p0 "${FILESDIR}"/${PN}-config.patch
+	# fix gif unbundle
+	eapply -p0 "${FILESDIR}"/${PN}-gif.patch
+	# fix for libpng15 compability
+	eapply -p0 "${FILESDIR}"/${PN}-libpng15.patch
+	# add giflib-5 API support, bug 571654
+	eapply "${FILESDIR}"/${PN}-giflib5-v2.patch
+	# do not build examples
+	use examples || sed -i \
+		-e '/^all:/s/apps//' \
+		-e '/^install:/s/install.apps//' \
+		Makefile.in || die "sed failed"
+	# remove forced flags
+	sed -i \
+		-e 's/CFLAGS="-O3"//' \
+		-e 's/ -rdynamic//' \
+		configure.in || die "sed failed"
+
+	mv configure.in configure.ac || die
+	eautoreconf
+}
+
+src_configure() {
+	econf \
+		$(use_enable cpu_flags_x86_mmx mmx-optimization) \
+		$(use_enable opengl glx) \
+		$(use_enable nls i18n) \
+		$(use_enable shaping) \
+		$(use_enable shm shmimage ) \
+		$(use_enable static-libs staticlibs) \
+		$(use_with X x) \
+		$(use_with gif) \
+		$(use_with jpeg) \
+		$(use_with png) \
+		$(use_with svg) \
+		$(use_with tiff) \
+		$(use_with truetype ttf) \
+		--enable-sharedlibs \
+		--with-xpm \
+		--without-builtin-gif \
+		--without-builtin-jpeg \
+		--without-builtin-png \
+		--without-builtin-zlib \
+		--without-afterbase
+}
+
+src_install() {
+	emake \
+		DESTDIR="${D}" \
+		AFTER_DOC_DIR="${ED}/usr/share/doc/${PF}" \
+		install
+	dodoc ChangeLog README
+	if use examples; then
+		cd apps || die
+		mv ascompose.man ascompose.1 || die
+		doman ascompose.1
+		emake clean
+		rm Makefile* ascompose.1 || die
+		insinto /usr/share/doc/${PF}/examples
+		doins *
+	fi
+}


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2017-01-17 22:35 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-17 22:35 [gentoo-commits] repo/gentoo:master commit in: media-libs/libafterimage/files/, media-libs/libafterimage/ Andrew Savchenko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox