From 67e76ace812869f314fb2eff3f02d1ed52d8a7a2 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Thu, 20 Sep 2012 15:34:11 -0600 Subject: [PATCH] - Demangle function pointers before testing them (#816647) --- glibc-rh816647.patch | 118 +++++++++++++++++++++++++++++++++++++++++++ glibc.spec | 5 ++ 2 files changed, 123 insertions(+) create mode 100644 glibc-rh816647.patch diff --git a/glibc-rh816647.patch b/glibc-rh816647.patch new file mode 100644 index 0000000..e732445 --- /dev/null +++ b/glibc-rh816647.patch @@ -0,0 +1,118 @@ +2012-09-20 Jeff Law + + [BZ #14594] + * iconv/gconv_cache.c (find_module): Demangle function pointer + before testing it. + * iconv/gconv_db.c (free_derivation): Likewise. + (__gconv_release_step, gen_steps, increment_counter): Likewise. + +diff --git a/iconv/gconv_cache.c b/iconv/gconv_cache.c +index 90b6cff..9e23708 100644 +--- a/iconv/gconv_cache.c ++++ b/iconv/gconv_cache.c +@@ -1,5 +1,5 @@ + /* Cache handling for iconv modules. +- Copyright (C) 2001, 2002, 2003, 2005, 2007 Free Software Foundation, Inc. ++ Copyright (C) 2001-2003, 2005, 2007, 2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 2001. + +@@ -206,13 +206,13 @@ find_module (const char *directory, const char *filename, + result->__btowc_fct = NULL; + result->__data = NULL; + +- /* Call the init function. */ +- if (result->__init_fct != NULL) +- { +- __gconv_init_fct init_fct = result->__init_fct; ++ __gconv_init_fct init_fct = result->__init_fct; + #ifdef PTR_DEMANGLE +- PTR_DEMANGLE (init_fct); ++ PTR_DEMANGLE (init_fct); + #endif ++ /* Call the init function. */ ++ if (init_fct != NULL) ++ { + status = DL_CALL_FCT (init_fct, (result)); + + #ifdef PTR_MANGLE +diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c +index 01015e8..7f91c7d 100644 +--- a/iconv/gconv_db.c ++++ b/iconv/gconv_db.c +@@ -179,16 +179,17 @@ free_derivation (void *p) + size_t cnt; + + for (cnt = 0; cnt < deriv->nsteps; ++cnt) +- if (deriv->steps[cnt].__counter > 0 +- && deriv->steps[cnt].__end_fct != NULL) ++ if (deriv->steps[cnt].__counter > 0) + { +- assert (deriv->steps[cnt].__shlib_handle != NULL); +- + __gconv_end_fct end_fct = deriv->steps[cnt].__end_fct; + #ifdef PTR_DEMANGLE + PTR_DEMANGLE (end_fct); + #endif +- DL_CALL_FCT (end_fct, (&deriv->steps[cnt])); ++ if (end_fct != NULL) ++ { ++ assert (deriv->steps[cnt].__shlib_handle != NULL); ++ DL_CALL_FCT (end_fct, (&deriv->steps[cnt])); ++ } + } + + /* Free the name strings. */ +@@ -211,15 +212,15 @@ __gconv_release_step (struct __gconv_step *step) + /* Skip builtin modules; they are not reference counted. */ + if (step->__shlib_handle != NULL && --step->__counter == 0) + { ++ __gconv_end_fct end_fct = step->__end_fct; ++#ifdef PTR_DEMANGLE ++ PTR_DEMANGLE (end_fct); ++#endif + /* Call the destructor. */ +- if (step->__end_fct != NULL) ++ if (end_fct != NULL) + { + assert (step->__shlib_handle != NULL); + +- __gconv_end_fct end_fct = step->__end_fct; +-#ifdef PTR_DEMANGLE +- PTR_DEMANGLE (end_fct); +-#endif + DL_CALL_FCT (end_fct, (step)); + } + +@@ -293,13 +294,13 @@ gen_steps (struct derivation_step *best, const char *toset, + + /* Call the init function. */ + __gconv_init_fct init_fct = result[step_cnt].__init_fct; ++# ifdef PTR_DEMANGLE ++ PTR_DEMANGLE (init_fct); ++# endif + if (init_fct != NULL) + { + assert (result[step_cnt].__shlib_handle != NULL); + +-# ifdef PTR_DEMANGLE +- PTR_DEMANGLE (init_fct); +-# endif + status = DL_CALL_FCT (init_fct, (&result[step_cnt])); + + if (__builtin_expect (status, __GCONV_OK) != __GCONV_OK) +@@ -393,11 +394,11 @@ increment_counter (struct __gconv_step *steps, size_t nsteps) + + /* Call the init function. */ + __gconv_init_fct init_fct = step->__init_fct; +- if (init_fct != NULL) +- { + #ifdef PTR_DEMANGLE +- PTR_DEMANGLE (init_fct); ++ PTR_DEMANGLE (init_fct); + #endif ++ if (init_fct != NULL) ++ { + DL_CALL_FCT (init_fct, (step)); + + #ifdef PTR_MANGLE diff --git a/glibc.spec b/glibc.spec index 4980d41..04ae5fb 100644 --- a/glibc.spec +++ b/glibc.spec @@ -193,6 +193,9 @@ Patch2027: %{name}-rh819430.patch # See http://sourceware.org/ml/libc-alpha/2012-06/msg00074.html Patch2028: %{name}-rh767693-2.patch +# Upstream BZ 14594 +Patch2068: %{name}-rh816647.patch + Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Obsoletes: glibc-profile < 2.4 Obsoletes: nss_db @@ -482,6 +485,7 @@ package or when debugging this package. %patch0065 -p1 %patch0066 -p1 %patch0067 -p1 +%patch2068 -p1 # On powerpc32, hp timing is only available in power4/power6 # libs, not in base, so pre-power4 dynamic linker is incompatible @@ -1277,6 +1281,7 @@ rm -f *.filelist* %changelog * Thu Sep 20 2012 Jeff Law - 2.16.90-12 + - Demangle function pointers before testing them (#816647) - Remove handling of /etc/localtime and /var/spool/postfix/etc/localtime as systemd will be handling them from now on (#858735).