Skip to content

Commit

Permalink
media-libs/giflib: Fix reallocarray export collision
Browse files Browse the repository at this point in the history
Closes: https://bugs.gentoo.org/637438
Package-Manager: Portage-2.3.24, Repoman-2.3.6
  • Loading branch information
hartwork committed Mar 23, 2018
1 parent 192e3fe commit 010e1c1
Show file tree
Hide file tree
Showing 2 changed files with 204 additions and 0 deletions.
129 changes: 129 additions & 0 deletions media-libs/giflib/files/giflib-5.1.4-reallocarray-export.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
From 9805c76d4f76c77aad9f285e81f4090cdf661fac Mon Sep 17 00:00:00 2001
From: Sebastian Pipping <[email protected]>
Date: Wed, 14 Mar 2018 21:18:14 +0100
Subject: [PATCH] Address clash of export reallocarray with glibc
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

.. by not exporting that internal symbol any more,
and renaming the function in code and where it's used

Bug: https://bugs.gentoo.org/637438

Compile error was:

/usr/include/gif_lib.h:248:51: error: declaration of ‘void* reallocarray(void*, size_t, size_t)’ has a different exception specifier
reallocarray(void *optr, size_t nmemb, size_t size);
^
[..]
/usr/include/stdlib.h:443:14: error: from previous declaration ‘void* reallocarray(void*, size_t, size_t) throw ()’
extern void *reallocarray (void *__ptr, size_t __nmemb, size_t __size)
---
lib/dgif_lib.c | 4 ++--
lib/gif_lib.h | 3 ---
lib/gifalloc.c | 10 +++++-----
lib/openbsd-reallocarray.c | 2 +-
4 files changed, 8 insertions(+), 11 deletions(-)

diff --git a/lib/dgif_lib.c b/lib/dgif_lib.c
index 66a1d6a..f0e0385 100644
--- a/lib/dgif_lib.c
+++ b/lib/dgif_lib.c
@@ -396,7 +396,7 @@ DGifGetImageDesc(GifFileType *GifFile)

if (GifFile->SavedImages) {
SavedImage* new_saved_images =
- (SavedImage *)reallocarray(GifFile->SavedImages,
+ (SavedImage *)openbsd_reallocarray(GifFile->SavedImages,
(GifFile->ImageCount + 1), sizeof(SavedImage));
if (new_saved_images == NULL) {
GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM;
@@ -1108,7 +1108,7 @@ DGifSlurp(GifFileType *GifFile)
if (ImageSize > (SIZE_MAX / sizeof(GifPixelType))) {
return GIF_ERROR;
}
- sp->RasterBits = (unsigned char *)reallocarray(NULL, ImageSize,
+ sp->RasterBits = (unsigned char *)openbsd_reallocarray(NULL, ImageSize,
sizeof(GifPixelType));

if (sp->RasterBits == NULL) {
diff --git a/lib/gif_lib.h b/lib/gif_lib.h
index 078930c..7914a69 100644
--- a/lib/gif_lib.h
+++ b/lib/gif_lib.h
@@ -244,9 +244,6 @@ extern ColorMapObject *GifUnionColorMap(const ColorMapObject *ColorIn1,
GifPixelType ColorTransIn2[]);
extern int GifBitSize(int n);

-extern void *
-reallocarray(void *optr, size_t nmemb, size_t size);
-
/******************************************************************************
Support for the in-core structures allocation (slurp mode).
******************************************************************************/
diff --git a/lib/gifalloc.c b/lib/gifalloc.c
index 3b51868..1394cfa 100644
--- a/lib/gifalloc.c
+++ b/lib/gifalloc.c
@@ -188,7 +188,7 @@ GifUnionColorMap(const ColorMapObject *ColorIn1,

/* perhaps we can shrink the map? */
if (RoundUpTo < ColorUnion->ColorCount) {
- GifColorType *new_map = (GifColorType *)reallocarray(Map,
+ GifColorType *new_map = (GifColorType *)openbsd_reallocarray(Map,
RoundUpTo, sizeof(GifColorType));
if( new_map == NULL ) {
GifFreeMapObject(ColorUnion);
@@ -232,7 +232,7 @@ GifAddExtensionBlock(int *ExtensionBlockCount,
if (*ExtensionBlocks == NULL)
*ExtensionBlocks=(ExtensionBlock *)malloc(sizeof(ExtensionBlock));
else {
- ExtensionBlock* ep_new = (ExtensionBlock *)reallocarray
+ ExtensionBlock* ep_new = (ExtensionBlock *)openbsd_reallocarray
(*ExtensionBlocks, (*ExtensionBlockCount + 1),
sizeof(ExtensionBlock));
if( ep_new == NULL )
@@ -325,7 +325,7 @@ GifMakeSavedImage(GifFileType *GifFile, const SavedImage *CopyFrom)
if (GifFile->SavedImages == NULL)
GifFile->SavedImages = (SavedImage *)malloc(sizeof(SavedImage));
else
- GifFile->SavedImages = (SavedImage *)reallocarray(GifFile->SavedImages,
+ GifFile->SavedImages = (SavedImage *)openbsd_reallocarray(GifFile->SavedImages,
(GifFile->ImageCount + 1), sizeof(SavedImage));

if (GifFile->SavedImages == NULL)
@@ -355,7 +355,7 @@ GifMakeSavedImage(GifFileType *GifFile, const SavedImage *CopyFrom)
}

/* next, the raster */
- sp->RasterBits = (unsigned char *)reallocarray(NULL,
+ sp->RasterBits = (unsigned char *)openbsd_reallocarray(NULL,
(CopyFrom->ImageDesc.Height *
CopyFrom->ImageDesc.Width),
sizeof(GifPixelType));
@@ -369,7 +369,7 @@ GifMakeSavedImage(GifFileType *GifFile, const SavedImage *CopyFrom)

/* finally, the extension blocks */
if (sp->ExtensionBlocks != NULL) {
- sp->ExtensionBlocks = (ExtensionBlock *)reallocarray(NULL,
+ sp->ExtensionBlocks = (ExtensionBlock *)openbsd_reallocarray(NULL,
CopyFrom->ExtensionBlockCount,
sizeof(ExtensionBlock));
if (sp->ExtensionBlocks == NULL) {
diff --git a/lib/openbsd-reallocarray.c b/lib/openbsd-reallocarray.c
index aa70686..b922b01 100644
--- a/lib/openbsd-reallocarray.c
+++ b/lib/openbsd-reallocarray.c
@@ -27,7 +27,7 @@
#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))

void *
-reallocarray(void *optr, size_t nmemb, size_t size)
+openbsd_reallocarray(void *optr, size_t nmemb, size_t size)
{
if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
nmemb > 0 && SIZE_MAX / nmemb < size) {
--
2.16.2

75 changes: 75 additions & 0 deletions media-libs/giflib/giflib-5.1.4-r1.ebuild
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Copyright 1999-2018 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

EAPI=6

inherit eutils libtool multilib-minimal

DESCRIPTION="Library to handle, display and manipulate GIF images"
HOMEPAGE="https://sourceforge.net/projects/giflib/"
SRC_URI="mirror://sourceforge/giflib/${P}.tar.bz2"

LICENSE="MIT"
SLOT="0/7"
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~amd64-fbsd ~x86-fbsd ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~sparc-solaris ~x64-solaris ~x86-solaris"
IUSE="doc static-libs"

RDEPEND="
abi_x86_32? (
!<=app-emulation/emul-linux-x86-baselibs-20140406-r1
!app-emulation/emul-linux-x86-baselibs[-abi_x86_32]
)"
DEPEND="${RDEPEND}
doc? ( app-text/xmlto )"

PATCHES=(
"${FILESDIR}"/${P}-reallocarray-export.patch
)

src_prepare() {
default
elibtoolize
}

multilib_src_configure() {
local myeconfargs=(
# No need for xmlto as they ship generated files.
ac_cv_prog_have_xmlto=no

$(use_enable static-libs static)
)

ECONF_SOURCE="${S}" \
econf "${myeconfargs[@]}"
}

multilib_src_compile() {
default

if use doc && multilib_is_native_abi; then
emake -C doc
fi
}

multilib_src_install() {
default

# for static libs the .la file is required if built with +X
use static-libs || prune_libtool_files --all

if use doc && multilib_is_native_abi; then
docinto html
dodoc doc/*.html
fi
}

multilib_src_install_all() {
doman doc/*.1
docinto
dodoc AUTHORS BUGS ChangeLog NEWS README TODO
if use doc; then
dodoc doc/*.txt
docinto html
dodoc -r doc/whatsinagif
fi
}

0 comments on commit 010e1c1

Please sign in to comment.