aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
strsec = section_headers + sec->sh_link;
- assert (aux.strtab == NULL);
+ if (aux.strtab != NULL)
+ {
+ error (_("Multiple auxillary string tables encountered\n"));
+ free (aux.strtab);
+ }
aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
1, strsec->sh_size,
_("string table"));
char * suffix;
size_t len, len2;
- for (i = unwstart, sec = section_headers + unwstart;
+ for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
i < elf_header.e_shnum; ++i, ++sec)
if (sec->sh_type == SHT_IA_64_UNWIND)
{
unwsec = sec;
break;
}
+ /* We have already counted the number of SHT_IA64_UNWIND
+ sections so the loop above should never fail. */
+ assert (unwsec != NULL);
unwstart = i + 1;
len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
if ((unwsec->sh_flags & SHF_GROUP) != 0)
{
/* We need to find which section group it is in. */
- struct group_list * g = section_headers_groups [i]->root;
+ struct group_list * g;
- for (; g != NULL; g = g->next)
+ if (section_headers_groups == NULL
+ || section_headers_groups [i] == NULL)
+ i = elf_header.e_shnum;
+ else
{
- sec = section_headers + g->section_index;
+ g = section_headers_groups [i]->root;
- if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
- break;
- }
+ for (; g != NULL; g = g->next)
+ {
+ sec = section_headers + g->section_index;
- if (g == NULL)
- i = elf_header.e_shnum;
+ if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
+ break;
+ }
+
+ if (g == NULL)
+ i = elf_header.e_shnum;
+ }
}
else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
{
{
aux.info_addr = sec->sh_addr;
aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
- sec->sh_size,
- _("unwind info"));
+ sec->sh_size,
+ _("unwind info"));
aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
printf (_("\nUnwind section "));
aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
strsec = section_headers + sec->sh_link;
- assert (aux.strtab == NULL);
+ if (aux.strtab != NULL)
+ {
+ error (_("Multiple auxillary string tables encountered\n"));
+ free (aux.strtab);
+ }
aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
1, strsec->sh_size,
_("string table"));
if ((buf[i] & 0x80) == 0)
break;
}
- assert (i < sizeof (buf));
- offset = read_uleb128 (buf, &len, buf + i + 1);
- assert (len == i + 1);
- offset = offset * 4 + 0x204;
- printf ("vsp = vsp + %ld", offset);
+ if (i == sizeof (buf))
+ printf (_("corrupt change to vsp"));
+ else
+ {
+ offset = read_uleb128 (buf, &len, buf + i + 1);
+ assert (len == i + 1);
+ offset = offset * 4 + 0x204;
+ printf ("vsp = vsp + %ld", offset);
+ }
}
else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
{
/* PR binutils/17531 file: 011-12666-0.004. */
if (aux.strtab != NULL)
{
- warn (_("Multiple string tables found in file.\n"));
+ error (_("Multiple string tables found in file.\n"));
free (aux.strtab);
}
aux.strtab = get_data (NULL, file, strsec->sh_offset,
unsigned short int flags = dynamic_syminfo[i].si_flags;
printf ("%4d: ", i);
- assert (i < num_dynamic_syms);
- if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
+ if (i >= num_dynamic_syms)
+ printf (_("<corrupt index>"));
+ else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
else
printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
#else
printf (" [%6Ix] ", (size_t) (data - start));
#endif
- print_symbol ((int) maxlen, data);
- putchar ('\n');
- data += strnlen (data, maxlen);
+ if (maxlen > 0)
+ {
+ print_symbol ((int) maxlen, data);
+ putchar ('\n');
+ data += strnlen (data, maxlen);
+ }
+ else
+ {
+ printf (_("<corrupt>\n"));
+ data = end;
+ }
some_strings_shown = TRUE;
}
}
if (p >= end)
{
- warn (_("corrupt tag\n"));
+ warn (_("<corrupt tag>\n"));
}
else if (tag & 1)
{
size_t maxlen = (end - p) - 1;
putchar ('"');
- print_symbol ((int) maxlen, (const char *) p);
+ if (maxlen > 0)
+ {
+ print_symbol ((int) maxlen, (const char *) p);
+ p += strnlen ((char *) p, maxlen) + 1;
+ }
+ else
+ {
+ printf (_("<corrupt string tag>"));
+ p = (unsigned char *) end;
+ }
printf ("\"\n");
- p += strnlen ((char *) p, maxlen) + 1;
}
else
{
printf ("%ld (0x%lx)\n", val, val);
}
+ assert (p <= end);
return p;
}
case 32: /* Tag_compatibility. */
{
- size_t maxlen;
-
val = read_uleb128 (p, &len, end);
p += len;
- maxlen = (end - p) - 1;
printf (_("flag = %d, vendor = "), val);
- print_symbol ((int) maxlen, (const char *) p);
+ if (p < end - 1)
+ {
+ size_t maxlen = (end - p) - 1;
+
+ print_symbol ((int) maxlen, (const char *) p);
+ p += strnlen ((char *) p, maxlen) + 1;
+ }
+ else
+ {
+ printf (_("<corrupt>"));
+ p = (unsigned char *) end;
+ }
putchar ('\n');
- p += strnlen ((char *) p, maxlen) + 1;
}
break;
}
else
{
- size_t maxlen = (end - p) - 1;
+ if (p < end - 1)
+ {
+ size_t maxlen = (end - p) - 1;
- print_symbol ((int) maxlen, (const char *) p);
+ print_symbol ((int) maxlen, (const char *) p);
+ p += strnlen ((char *) p, maxlen) + 1;
+ }
+ else
+ {
+ printf (_("<corrupt>"));
+ p = (unsigned char *) end;
+ }
putchar ('\n');
- p += strnlen ((char *) p, maxlen) + 1;
}
return p;
}
case Tag_ABI_compatibility:
{
- size_t maxlen;
-
val = read_uleb128 (p, &len, end);
p += len;
printf (" Tag_ABI_compatibility: ");
- maxlen = (end - p) - 1;
printf (_("flag = %d, vendor = "), val);
- print_symbol ((int) maxlen, (const char *) p);
+ if (p < end - 1)
+ {
+ size_t maxlen = (end - p) - 1;
+
+ print_symbol ((int) maxlen, (const char *) p);
+ p += strnlen ((char *) p, maxlen) + 1;
+ }
+ else
+ {
+ printf (_("<corrupt>"));
+ p = (unsigned char *) end;
+ }
putchar ('\n');
- p += strnlen ((char *) p, maxlen) + 1;
return p;
}
case Tag_ABI_conformance:
{
- size_t maxlen;
+ printf (" Tag_ABI_conformance: \"");
+ if (p < end - 1)
+ {
+ size_t maxlen = (end - p) - 1;
- printf (" Tag_ABI_conformance: ");
- maxlen = (end - p) - 1;
- putchar ('"');
- print_symbol ((int) maxlen, (const char *) p);
+ print_symbol ((int) maxlen, (const char *) p);
+ p += strnlen ((char *) p, maxlen) + 1;
+ }
+ else
+ {
+ printf (_("<corrupt>"));
+ p = (unsigned char *) end;
+ }
printf ("\"\n");
- p += strnlen ((char *) p, maxlen) + 1;
return p;
}
}
if (tag & 1)
{
- size_t maxlen;
-
- maxlen = (end - p) - 1;
putchar ('"');
- print_symbol ((int) maxlen, (const char *) p);
+ if (p < end - 1)
+ {
+ size_t maxlen = (end - p) - 1;
+
+ print_symbol ((int) maxlen, (const char *) p);
+ p += strnlen ((char *) p, maxlen) + 1;
+ }
+ else
+ {
+ printf (_("<corrupt>"));
+ p = (unsigned char *) end;
+ }
printf ("\"\n");
- p += strnlen ((char *) p, maxlen) + 1;
}
else
{
break;
}
+ assert (p <= end);
return p;
}