[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

r4697 - in glibc-package/trunk/debian: . patches patches/any



Author: aurel32
Date: 2011-06-04 12:00:50 +0000 (Sat, 04 Jun 2011)
New Revision: 4697

Added:
   glibc-package/trunk/debian/patches/any/cvs-unique_sym_table-corruptions.diff
Modified:
   glibc-package/trunk/debian/changelog
   glibc-package/trunk/debian/patches/series
Log:
  * Add patches/any/cvs-unique_sym_table-corruptions.diff to fix 
    unique_sym_table corruptions when doing STB_GNU_UNIQUE or 
    ELF_RTYPE_CLASS_COPY lookups.



Modified: glibc-package/trunk/debian/changelog
===================================================================
--- glibc-package/trunk/debian/changelog	2011-06-04 11:53:37 UTC (rev 4696)
+++ glibc-package/trunk/debian/changelog	2011-06-04 12:00:50 UTC (rev 4697)
@@ -30,6 +30,9 @@
     some regexes.
   * Add patches/any/cvs-getaddrinfo-single-lookup.diff to fix fallbackup to
     single lookup dns requests.  Closes: #541167.
+  * Add patches/any/cvs-unique_sym_table-corruptions.diff to fix 
+    unique_sym_table corruptions when doing STB_GNU_UNIQUE or 
+    ELF_RTYPE_CLASS_COPY lookups.
 
   [ Steve Langasek ]
   * Tighten the dependency on dpkg to a multiarch aware version.

Added: glibc-package/trunk/debian/patches/any/cvs-unique_sym_table-corruptions.diff
===================================================================
--- glibc-package/trunk/debian/patches/any/cvs-unique_sym_table-corruptions.diff	                        (rev 0)
+++ glibc-package/trunk/debian/patches/any/cvs-unique_sym_table-corruptions.diff	2011-06-04 12:00:50 UTC (rev 4697)
@@ -0,0 +1,81 @@
+2011-05-12  Ulrich Drepper  <drepper@gmail.com>
+
+	[BZ #12511]
+	* elf/dl-lookup.c (enter): Don't test for copy relocation here and
+	don't set DF_1_NODELETE here.
+	(do_lookup_x): When entering new entry test for copy relocation
+	and if necessary set DF_1_NODELETE flag.
+
+diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c
+index 19b27d7..affb53f 100644
+--- a/elf/dl-lookup.c
++++ b/elf/dl-lookup.c
+@@ -312,39 +312,21 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
+ 		 definition we have to use it.  */
+ 	      void enter (struct unique_sym *table, size_t size,
+ 			  unsigned int hash, const char *name,
+-			  const ElfW(Sym) *sym, struct link_map *map)
++			  const ElfW(Sym) *sym, const struct link_map *map)
+ 	      {
+ 		size_t idx = hash % size;
+ 		size_t hash2 = 1 + hash % (size - 2);
+-		while (1)
++		while (table[idx].name != NULL)
+ 		  {
+-		    if (table[idx].name == NULL)
+-		      {
+-			table[idx].hashval = hash;
+-			table[idx].name = name;
+-			if ((type_class & ELF_RTYPE_CLASS_COPY) != 0)
+-			  {
+-			    table[idx].sym = ref;
+-			    table[idx].map = undef_map;
+-			  }
+-			else
+-			  {
+-			    table[idx].sym = sym;
+-			    table[idx].map = map;
+-
+-			    if (map->l_type == lt_loaded)
+-			      /* Make sure we don't unload this object by
+-				 setting the appropriate flag.  */
+-			      map->l_flags_1 |= DF_1_NODELETE;
+-			  }
+-
+-			return;
+-		      }
+-
+ 		    idx += hash2;
+ 		    if (idx >= size)
+ 		      idx -= size;
+ 		  }
++
++		table[idx].hashval = hash;
++		table[idx].name = name;
++		table[idx].sym = sym;
++		table[idx].map = map;
+ 	      }
+ 
+ 	      struct unique_sym_table *tab
+@@ -450,8 +432,19 @@ do_lookup_x (const char *undef_name, uint_fast32_t new_hash,
+ 		  tab->free = free;
+ 		}
+ 
+-	      enter (entries, size, new_hash, strtab + sym->st_name, sym,
+-		     (struct link_map *) map);
++	      if ((type_class & ELF_RTYPE_CLASS_COPY) != 0)
++		enter (entries, size, new_hash, strtab + sym->st_name, ref,
++		       undef_map);
++	      else
++		{
++		  enter (entries, size, new_hash, strtab + sym->st_name, sym,
++			 map);
++
++		  if (map->l_type == lt_loaded)
++		    /* Make sure we don't unload this object by
++		       setting the appropriate flag.  */
++		    ((struct link_map *) map)->l_flags_1 |= DF_1_NODELETE;
++		}
+ 	      ++tab->n_elements;
+ 
+ 	      __rtld_lock_unlock_recursive (tab->lock);

Modified: glibc-package/trunk/debian/patches/series
===================================================================
--- glibc-package/trunk/debian/patches/series	2011-06-04 11:53:37 UTC (rev 4696)
+++ glibc-package/trunk/debian/patches/series	2011-06-04 12:00:50 UTC (rev 4697)
@@ -262,3 +262,4 @@
 any/local-tst-writev.diff
 any/cvs-regex-oom.diff
 any/cvs-getaddrinfo-single-lookup.diff
+any/cvs-unique_sym_table-corruptions.diff


Reply to: