diff options
| author | Simon J. Gerraty <sjg@FreeBSD.org> | 2014-05-08 23:54:15 +0000 |
|---|---|---|
| committer | Simon J. Gerraty <sjg@FreeBSD.org> | 2014-05-08 23:54:15 +0000 |
| commit | cc3f4b99653c34ae64f8a1fddea370abefef680e (patch) | |
| tree | 8ce0ddd0e6f508bd20c77429c448969589170fae /usr.sbin/kldxref | |
| parent | f974b33f6ed6f35170c520d2be111bfc2c3954cd (diff) | |
| parent | 16aa1f0950a3b4407a36ecc96acc8ca0710ebd91 (diff) | |
Notes
Diffstat (limited to 'usr.sbin/kldxref')
| -rw-r--r-- | usr.sbin/kldxref/ef.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/usr.sbin/kldxref/ef.c b/usr.sbin/kldxref/ef.c index b68389801345..88fbc34a43b6 100644 --- a/usr.sbin/kldxref/ef.c +++ b/usr.sbin/kldxref/ef.c @@ -47,6 +47,7 @@ #include "ef.h" +#define MAXSEGS 2 struct ef_file { char* ef_name; struct elf_file *ef_efile; @@ -68,7 +69,7 @@ struct ef_file { Elf_Off ef_symoff; Elf_Sym* ef_symtab; int ef_nsegs; - Elf_Phdr * ef_segs[2]; + Elf_Phdr * ef_segs[MAXSEGS]; int ef_verbose; Elf_Rel * ef_rel; /* relocation table */ int ef_relsz; /* number of entries */ @@ -580,12 +581,9 @@ ef_open(const char *filename, struct elf_file *efile, int verbose) ef_print_phdr(phdr); switch (phdr->p_type) { case PT_LOAD: - if (nsegs == 2) { - warnx("%s: too many sections", - filename); - break; - } - ef->ef_segs[nsegs++] = phdr; + if (nsegs < MAXSEGS) + ef->ef_segs[nsegs] = phdr; + nsegs++; break; case PT_PHDR: break; @@ -597,12 +595,15 @@ ef_open(const char *filename, struct elf_file *efile, int verbose) } if (verbose > 1) printf("\n"); - ef->ef_nsegs = nsegs; if (phdyn == NULL) { warnx("Skipping %s: not dynamically-linked", filename); break; + } else if (nsegs > MAXSEGS) { + warnx("%s: too many sections", filename); + break; } + ef->ef_nsegs = nsegs; if (ef_read_entry(ef, phdyn->p_offset, phdyn->p_filesz, (void**)&ef->ef_dyn) != 0) { printf("ef_read_entry failed\n"); |
