#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: readelf.c,v 1.87 2011/05/13 22:15:24 christos Exp $")
+FILE_RCSID("@(#)$File: readelf.c,v 1.88 2011/07/19 18:54:25 christos Exp $")
#endif
#ifdef BUILTIN_ELF
#endif
private int dophn_exec(struct magic_set *, int, int, int, off_t, int, size_t,
off_t, int *, int);
-private int doshn(struct magic_set *, int, int, int, off_t, int, size_t, int *,
- int);
+private int doshn(struct magic_set *, int, int, int, off_t, int, size_t,
+ off_t, int *, int);
private size_t donote(struct magic_set *, void *, size_t, size_t, int,
int, size_t, int *);
#define xsh_size (clazz == ELFCLASS32 \
? elf_getu32(swap, sh32.sh_size) \
: elf_getu64(swap, sh64.sh_size))
-#define xsh_offset (clazz == ELFCLASS32 \
+#define xsh_offset (off_t)(clazz == ELFCLASS32 \
? elf_getu32(swap, sh32.sh_offset) \
: elf_getu64(swap, sh64.sh_offset))
#define xsh_type (clazz == ELFCLASS32 \
size_t offset;
unsigned char nbuf[BUFSIZ];
ssize_t bufsize;
- off_t savedoffset;
- struct stat st;
-
- if (fstat(fd, &st) < 0) {
- file_badread(ms);
- return -1;
- }
if (size != xph_sizeof) {
if (file_printf(ms, ", corrupted program header size") == -1)
* Loop through all the program headers.
*/
for ( ; num; num--) {
- if ((savedoffset = lseek(fd, off, SEEK_SET)) == (off_t)-1) {
+ if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
file_badseek(ms);
return -1;
}
file_badread(ms);
return -1;
}
+ off += size;
+
if (xph_offset > fsize) {
- if (lseek(fd, savedoffset, SEEK_SET) == (off_t)-1) {
- file_badseek(ms);
- return -1;
- }
+ /* Perhaps warn here */
continue;
}
- off += size;
if (xph_type != PT_NOTE)
continue;
private int
doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
- size_t size, int *flags, int mach)
+ size_t size, off_t fsize, int *flags, int mach)
{
Elf32_Shdr sh32;
Elf64_Shdr sh64;
return 0;
}
- if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
- file_badseek(ms);
- return -1;
- }
-
for ( ; num; num--) {
+ if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
+ file_badseek(ms);
+ return -1;
+ }
if (read(fd, xsh_addr, xsh_sizeof) == -1) {
file_badread(ms);
return -1;
}
+ off += size;
+
+ if (xsh_offset > fsize) {
+ /* Perhaps warn here */
+ continue;
+ }
+
switch (xsh_type) {
case SHT_SYMTAB:
#if 0
stripped = 0;
break;
case SHT_NOTE:
- if ((off = lseek(fd, (off_t)0, SEEK_CUR)) ==
- (off_t)-1) {
- file_badread(ms);
- return -1;
- }
if ((nbuf = malloc((size_t)xsh_size)) == NULL) {
file_error(ms, errno, "Cannot allocate memory"
" for note");
if (noff == 0)
break;
}
- if ((lseek(fd, off, SEEK_SET)) == (off_t)-1) {
- free(nbuf);
- file_badread(ms);
- return -1;
- }
free(nbuf);
break;
case SHT_SUNW_cap:
{
off_t coff;
- if ((off = lseek(fd, (off_t)0, SEEK_CUR)) ==
- (off_t)-1) {
- file_badread(ms);
- return -1;
- }
if (lseek(fd, (off_t)xsh_offset, SEEK_SET) ==
(off_t)-1) {
- file_badread(ms);
+ file_badseek(ms);
return -1;
}
coff = 0;
break;
}
}
- if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
- file_badread(ms);
- return -1;
- }
break;
}
}
unsigned char nbuf[BUFSIZ];
ssize_t bufsize;
size_t offset, align;
- off_t savedoffset = (off_t)-1;
- struct stat st;
-
- if (fstat(fd, &st) < 0) {
- file_badread(ms);
- return -1;
- }
if (size != xph_sizeof) {
if (file_printf(ms, ", corrupted program header size") == -1)
return 0;
}
- if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
- file_badseek(ms);
- return -1;
- }
-
for ( ; num; num--) {
- if (read(fd, xph_addr, xph_sizeof) == -1) {
- file_badread(ms);
+ if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
+ file_badseek(ms);
return -1;
}
- if (xph_offset > st.st_size && savedoffset != (off_t)-1) {
- if (lseek(fd, savedoffset, SEEK_SET) == (off_t)-1) {
- file_badseek(ms);
- return -1;
- }
- continue;
- }
- if ((savedoffset = lseek(fd, (off_t)0, SEEK_CUR)) == (off_t)-1) {
- file_badseek(ms);
+ if (read(fd, xph_addr, xph_sizeof) == -1) {
+ file_badread(ms);
return -1;
}
+ off += size;
if (xph_offset > fsize) {
- if (lseek(fd, savedoffset, SEEK_SET) == (off_t)-1) {
- file_badseek(ms);
- return -1;
- }
+ /* Maybe warn here? */
continue;
}
* This is a PT_NOTE section; loop through all the notes
* in the section.
*/
- if (lseek(fd, xph_offset, SEEK_SET)
- == (off_t)-1) {
+ if (lseek(fd, xph_offset, SEEK_SET) == (off_t)-1) {
file_badseek(ms);
return -1;
}
if (offset == 0)
break;
}
- if (lseek(fd, savedoffset, SEEK_SET) == (off_t)-1) {
- file_badseek(ms);
- return -1;
- }
break;
default:
break;