+2014-11-17 Mark Wielaard <mjw@redhat.com>
+
+ * readelf.c (handle_verneed): Check vna_next and vn_next exist.
+ (handle_verdef): Check vda_next and vd_next exist.
+ (handle_versym): Check vd_next, vna_next and vn_next exist.
+ Check vername and filename are not NULL before use.
+
2014-11-17 Mark Wielaard <mjw@redhat.com>
* elfcmp.c (main): Check section names are NULL before use.
get_ver_flags (aux->vna_flags),
(unsigned short int) aux->vna_other);
+ if (aux->vna_next == 0)
+ break;
+
auxoffset += aux->vna_next;
}
/* Find the next offset. */
+ if (need->vn_next == 0)
+ break;
+
offset += need->vn_next;
}
}
auxoffset, cnt2,
elf_strptr (ebl->elf, shdr->sh_link, aux->vda_name));
+ if (aux->vda_next == 0)
+ break;
+
auxoffset += aux->vda_next;
}
/* Find the next offset. */
+ if (def->vd_next == 0)
+ break;
offset += def->vd_next;
}
}
nvername = MAX (nvername, (size_t) (def->vd_ndx & 0x7fff));
+ if (def->vd_next == 0)
+ break;
offset += def->vd_next;
}
}
nvername = MAX (nvername,
(size_t) (aux->vna_other & 0x7fff));
+ if (aux->vna_next == 0)
+ break;
auxoffset += aux->vna_next;
}
+ if (need->vn_next == 0)
+ break;
offset += need->vn_next;
}
}
= elf_strptr (ebl->elf, defshdr->sh_link, aux->vda_name);
filename[def->vd_ndx & 0x7fff] = NULL;
+ if (def->vd_next == 0)
+ break;
offset += def->vd_next;
}
}
filename[aux->vna_other & 0x7fff]
= elf_strptr (ebl->elf, needshdr->sh_link, need->vn_file);
+ if (aux->vna_next == 0)
+ break;
auxoffset += aux->vna_next;
}
+ if (need->vn_next == 0)
+ break;
offset += need->vn_next;
}
}
default:
n = printf ("%4d%c%s",
*sym & 0x7fff, *sym & 0x8000 ? 'h' : ' ',
- (unsigned int) (*sym & 0x7fff) < nvername
+ (vername != NULL
+ && (unsigned int) (*sym & 0x7fff) < nvername)
? vername[*sym & 0x7fff] : "???");
if ((unsigned int) (*sym & 0x7fff) < nvername
- && filename[*sym & 0x7fff] != NULL)
+ && filename != NULL && filename[*sym & 0x7fff] != NULL)
n += printf ("(%s)", filename[*sym & 0x7fff]);
printf ("%*s", MAX (0, 33 - (int) n), " ");
break;