[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