This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

readelf divide by zero.


Before I committed
http://sources.redhat.com/ml/binutils/2001-06/msg00695.html HJ's testcase,
http://sources.redhat.com/ml/binutils/2001-06/msg00690/bug.tar.gz, was
bombing readelf due to the existence of a .rel.data with a single
R_386_NONE reloc.

binutils/ChangeLog
	* readelf.c (dump_relocations): Print "bad symbol index" if
	symtab == NULL with non-zero symtab_index.
	(process_relocs): Don't bomb if reloc section has no symsec.

Index: binutils/readelf.c
===================================================================
RCS file: /cvs/src/src/binutils/readelf.c,v
retrieving revision 1.104
diff -u -p -r1.104 readelf.c
--- readelf.c	2001/06/19 11:57:28	1.104
+++ readelf.c	2001/06/25 02:20:29
@@ -964,31 +964,28 @@ dump_relocations (file, rel_offset, rel_
 
       if (symtab_index)
 	{
-	  if (symtab != NULL)
+	  if (symtab == NULL || symtab_index >= nsyms)
+	    printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
+	  else
 	    {
-	      if (symtab_index >= nsyms)
-		printf (" bad symbol index: %08lx", (unsigned long) symtab_index);
-	      else
-		{
-		  Elf_Internal_Sym * psym;
+	      Elf_Internal_Sym * psym;
 
-		  psym = symtab + symtab_index;
+	      psym = symtab + symtab_index;
 
-		  printf (" ");
-		  print_vma (psym->st_value, LONG_HEX);
-		  printf ("  ");
-
-		  if (psym->st_name == 0)
-		    printf ("%-25.25s",
-			    SECTION_NAME (section_headers + psym->st_shndx));
-		  else if (strtab == NULL)
-		    printf (_("<string table index %3ld>"), psym->st_name);
-		  else
-		    printf ("%-25.25s", strtab + psym->st_name);
+	      printf (" ");
+	      print_vma (psym->st_value, LONG_HEX);
+	      printf ("  ");
+
+	      if (psym->st_name == 0)
+		printf ("%-25.25s",
+			SECTION_NAME (section_headers + psym->st_shndx));
+	      else if (strtab == NULL)
+		printf (_("<string table index %3ld>"), psym->st_name);
+	      else
+		printf ("%-25.25s", strtab + psym->st_name);
 
-		  if (is_rela)
-		    printf (" + %lx", (unsigned long) relas [i].r_addend);
-		}
+	      if (is_rela)
+		printf (" + %lx", (unsigned long) relas [i].r_addend);
 	    }
 	}
       else if (is_rela)
@@ -3073,7 +3070,6 @@ process_relocs (file)
 	  if (rel_size)
 	    {
 	      Elf32_Internal_Shdr * strsec;
-	      Elf32_Internal_Shdr * symsec;
 	      Elf_Internal_Sym *    symtab;
 	      char *                strtab;
 	      int                   is_rela;
@@ -3088,26 +3084,34 @@ process_relocs (file)
 
 	      printf (_(" at offset 0x%lx contains %lu entries:\n"),
 		 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
-
-	      symsec = section_headers + section->sh_link;
 
-	      nsyms = symsec->sh_size / symsec->sh_entsize;
-	      symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
+	      symtab = NULL;
+	      strtab = NULL;
+	      nsyms = 0;
+	      if (section->sh_link)
+		{
+		  Elf32_Internal_Shdr * symsec;
 
-	      if (symtab == NULL)
-		continue;
+		  symsec = section_headers + section->sh_link;
+		  nsyms = symsec->sh_size / symsec->sh_entsize;
+		  symtab = GET_ELF_SYMBOLS (file, symsec->sh_offset, nsyms);
 
-	      strsec = section_headers + symsec->sh_link;
+		  if (symtab == NULL)
+		    continue;
 
-	      GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
-			      char *, "string table");
+		  strsec = section_headers + symsec->sh_link;
 
+		  GET_DATA_ALLOC (strsec->sh_offset, strsec->sh_size, strtab,
+				  char *, "string table");
+		}
 	      is_rela = section->sh_type == SHT_RELA;
 
 	      dump_relocations (file, rel_offset, rel_size, symtab, nsyms, strtab, is_rela);
 
-	      free (strtab);
-	      free (symtab);
+	      if (strtab)
+		free (strtab);
+	      if (symtab)
+		free (symtab);
 
 	      found = 1;
 	    }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]