[glibc] - Demangle function pointers before testing them (#816647)
Jeffrey Law
law at fedoraproject.org
Thu Sep 20 21:35:15 UTC 2012
commit 67e76ace812869f314fb2eff3f02d1ed52d8a7a2
Author: Jeff Law <law at redhat.com>
Date: Thu Sep 20 15:34:11 2012 -0600
- Demangle function pointers before testing them (#816647)
glibc-rh816647.patch | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++
glibc.spec | 5 ++
2 files changed, 123 insertions(+), 0 deletions(-)
---
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 <law at redhat.com>
+
+ [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 <drepper at cygnus.com>, 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 <law at redhat.com> - 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).
More information about the scm-commits
mailing list