#include "readelf.h"
#ifndef lint
-FILE_RCSID("@(#)$Id: readelf.c,v 1.39 2004/03/22 20:28:40 christos Exp $")
+FILE_RCSID("@(#)$Id: readelf.c,v 1.40 2004/07/24 19:23:22 christos Exp $")
#endif
#ifdef ELFCORE
getu32(swap, ph32.p_align) : 4) \
: (off_t) (ph64.p_align ? \
getu64(swap, ph64.p_align) : 4)))
+#define ph_filesz (size_t)((class == ELFCLASS32 \
+ ? getu32(swap, ph32.p_filesz) \
+ : getu64(swap, ph64.p_filesz)))
#define nh_size (class == ELFCLASS32 \
? sizeof nh32 \
: sizeof nh64)
file_badseek(ms);
return -1;
}
- bufsize = read(fd, nbuf, BUFSIZ);
+ bufsize = read(fd, nbuf,
+ ((ph_filesz < BUFSIZ) ? ph_filesz : BUFSIZ));
if (bufsize == -1) {
file_badread(ms);
return -1;
noff = offset;
doff = ELF_ALIGN(offset + namesz);
- if (offset + namesz >= size) {
+ if (offset + namesz > size) {
/*
* We're past the end of the buffer.
*/
}
offset = ELF_ALIGN(doff + descsz);
- if (offset + descsz >= size) {
+ if (offset + descsz > size) {
return offset;
}
file_badseek(ms);
return -1;
}
- bufsize = read(fd, nbuf, sizeof(nbuf));
+ bufsize = read(fd, nbuf,
+ ((ph_filesz < sizeof(nbuf)) ?
+ ph_filesz : sizeof(nbuf)));
if (bufsize == -1) {
file_badread(ms);
return -1;
if (offset == 0)
break;
}
- if (lseek(fd, savedoffset + offset, SEEK_SET)
- == (off_t)-1) {
+ if (lseek(fd, savedoffset, SEEK_SET) == (off_t)-1) {
file_badseek(ms);
return -1;
}