summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@redhat.com>2010-04-14 22:16:06 -0700
committerPetr Baudis <pasky@ucw.cz>2010-05-12 03:21:17 +0200
commit59d5bd49df96b85c0e61ee21c74f0c7d91c34304 (patch)
tree6c46d55751bbe59b85d228242d4b600640c7370a
parent39879d17a46e063c674ecf5532cb8c1f49fc7277 (diff)
downloadglibc-59d5bd49df96b85c0e61ee21c74f0c7d91c34304.tar.gz
glibc-59d5bd49df96b85c0e61ee21c74f0c7d91c34304.tar.xz
glibc-59d5bd49df96b85c0e61ee21c74f0c7d91c34304.zip
Don't crash in trace mode when dependencies are missing
(cherry picked from commit 18a26b301b6ab0d68474fbfffb0d17adf69e8824)
-rw-r--r--ChangeLog5
-rw-r--r--elf/dl-version.c12
2 files changed, 13 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 18e059866e..c26934ae3b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2010-04-14  Andreas Schwab  <schwab@redhat.com>
+
+	* elf/dl-version.c (_dl_check_map_versions): Avoid index overflow
+	when dependencies are missing.
+
 2010-04-09  Ulrich Drepper  <drepper@redhat.com>
 
 	* nscd/aicache.c (addhstaiX): Correct passing memory to address
diff --git a/elf/dl-version.c b/elf/dl-version.c
index 9e881162a6..c59a6c3cd3 100644
--- a/elf/dl-version.c
+++ b/elf/dl-version.c
@@ -322,10 +322,14 @@ _dl_check_map_versions (struct link_map *map, int verbose, int trace_mode)
 	      while (1)
 		{
 		  ElfW(Half) ndx = aux->vna_other & 0x7fff;
-		  map->l_versions[ndx].hash = aux->vna_hash;
-		  map->l_versions[ndx].hidden = aux->vna_other & 0x8000;
-		  map->l_versions[ndx].name = &strtab[aux->vna_name];
-		  map->l_versions[ndx].filename = &strtab[ent->vn_file];
+		  /* In trace mode, dependencies may be missing.  */
+		  if (__builtin_expect (ndx < map->l_nversions, 1))
+		    {
+		      map->l_versions[ndx].hash = aux->vna_hash;
+		      map->l_versions[ndx].hidden = aux->vna_other & 0x8000;
+		      map->l_versions[ndx].name = &strtab[aux->vna_name];
+		      map->l_versions[ndx].filename = &strtab[ent->vn_file];
+		    }
 
 		  if (aux->vna_next == 0)
 		    /* No more symbols.  */