123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- Subject: Use pread (...)
- Upstream-Author: Christos Zoulas <christos@zoulas.com>
- Date: Mon Feb 18 15:40:59 2013 +0000
- Origin: FILE5_12-64-gd68a455
- Last-Update: 2015-01-05
- - use pread
- - add reading of section header names to determine if an ELF file is stripped
- (Jan Kaluza)
- (prequisite for TEMP-0000000-B67840)
- diff --git a/configure.ac b/configure.ac
- index 1511c9a..97a4689 100644
- --- a/configure.ac
- +++ b/configure.ac
- @@ -159,7 +159,7 @@ dnl Checks for functions
- AC_CHECK_FUNCS(mmap strerror strndup strtoul mbrtowc mkstemp utimes utime wcwidth strtof fork)
-
- dnl Provide implementation of some required functions if necessary
- -AC_REPLACE_FUNCS(getopt_long asprintf vasprintf strlcpy strlcat getline)
- +AC_REPLACE_FUNCS(getopt_long asprintf vasprintf strlcpy strlcat getline pread)
-
- dnl Checks for libraries
- AC_CHECK_LIB(z,gzopen)
- diff --git a/src/elfclass.h b/src/elfclass.h
- index 2e7741b..010958a 100644
- --- a/src/elfclass.h
- +++ b/src/elfclass.h
- @@ -59,7 +59,8 @@
- (off_t)elf_getu(swap, elfhdr.e_shoff),
- elf_getu16(swap, elfhdr.e_shnum),
- (size_t)elf_getu16(swap, elfhdr.e_shentsize),
- - fsize, &flags, elf_getu16(swap, elfhdr.e_machine)) == -1)
- + fsize, &flags, elf_getu16(swap, elfhdr.e_machine),
- + (int)elf_getu16(swap, elfhdr.e_shstrndx)) == -1)
- return -1;
- break;
-
- diff --git a/src/file.h b/src/file.h
- index e02009f..de262b2 100644
- --- a/src/file.h
- +++ b/src/file.h
- @@ -460,6 +460,9 @@ extern char *sys_errlist[];
- #define strtoul(a, b, c) strtol(a, b, c)
- #endif
-
- +#ifndef HAVE_PREAD
- +ssize_t pread(int, void *, size_t, off_t);
- +#endif
- #ifndef HAVE_VASPRINTF
- int vasprintf(char **, const char *, va_list);
- #endif
- diff --git a/src/pread.c b/src/pread.c
- new file mode 100644
- index 0000000..94eca15
- --- /dev/null
- +++ b/src/pread.c
- @@ -0,0 +1,14 @@
- +#include "file.h"
- +#ifndef lint
- +FILE_RCSID("@(#)$File: ctime_r.c,v 1.1 2012/05/15 17:14:36 christos Exp $")
- +#endif /* lint */
- +#include <fcntl.h>
- +#include <unistd.h>
- +
- +ssize_t
- +pread(int fd, void *buf, ssize_t len, off_t off) {
- + if (lseek(fd, off, SEEK_SET) == (off_t)-1)
- + return -1;
- +
- + return read(fd, buf, len);
- +}
- diff --git a/src/readelf.c b/src/readelf.c
- index 966805a..314adb7 100644
- --- a/src/readelf.c
- +++ b/src/readelf.c
- @@ -48,7 +48,7 @@ private int dophn_core(struct magic_set *, int, int, int, off_t, int, size_t,
- 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,
- - off_t, int *, int);
- + off_t, int *, int, int);
- private size_t donote(struct magic_set *, void *, size_t, size_t, int,
- int, size_t, int *);
-
- @@ -129,19 +129,21 @@ getu64(int swap, uint64_t value)
- #define elf_getu32(swap, value) getu32(swap, value)
- #ifdef USE_ARRAY_FOR_64BIT_TYPES
- # define elf_getu64(swap, array) \
- - ((swap ? ((uint64_t)elf_getu32(swap, array[0])) << 32 : elf_getu32(swap, array[0])) + \
- - (swap ? elf_getu32(swap, array[1]) : ((uint64_t)elf_getu32(swap, array[1]) << 32)))
- + ((swap ? ((uint64_t)elf_getu32(swap, array[0])) << 32 \
- + : elf_getu32(swap, array[0])) + \
- + (swap ? elf_getu32(swap, array[1]) : \
- + ((uint64_t)elf_getu32(swap, array[1]) << 32)))
- #else
- # define elf_getu64(swap, value) getu64(swap, value)
- #endif
-
- #define xsh_addr (clazz == ELFCLASS32 \
- - ? (void *) &sh32 \
- - : (void *) &sh64)
- + ? (void *)&sh32 \
- + : (void *)&sh64)
- #define xsh_sizeof (clazz == ELFCLASS32 \
- - ? sizeof sh32 \
- - : sizeof sh64)
- -#define xsh_size (clazz == ELFCLASS32 \
- + ? sizeof(sh32) \
- + : sizeof(sh64))
- +#define xsh_size (size_t)(clazz == ELFCLASS32 \
- ? elf_getu32(swap, sh32.sh_size) \
- : elf_getu64(swap, sh64.sh_size))
- #define xsh_offset (off_t)(clazz == ELFCLASS32 \
- @@ -150,12 +152,15 @@ getu64(int swap, uint64_t value)
- #define xsh_type (clazz == ELFCLASS32 \
- ? elf_getu32(swap, sh32.sh_type) \
- : elf_getu32(swap, sh64.sh_type))
- +#define xsh_name (clazz == ELFCLASS32 \
- + ? elf_getu32(swap, sh32.sh_name) \
- + : elf_getu32(swap, sh64.sh_name))
- #define xph_addr (clazz == ELFCLASS32 \
- ? (void *) &ph32 \
- : (void *) &ph64)
- #define xph_sizeof (clazz == ELFCLASS32 \
- - ? sizeof ph32 \
- - : sizeof ph64)
- + ? sizeof(ph32) \
- + : sizeof(ph64))
- #define xph_type (clazz == ELFCLASS32 \
- ? elf_getu32(swap, ph32.p_type) \
- : elf_getu32(swap, ph64.p_type))
- @@ -171,8 +176,8 @@ getu64(int swap, uint64_t value)
- ? elf_getu32(swap, ph32.p_filesz) \
- : elf_getu64(swap, ph64.p_filesz)))
- #define xnh_addr (clazz == ELFCLASS32 \
- - ? (void *) &nh32 \
- - : (void *) &nh64)
- + ? (void *)&nh32 \
- + : (void *)&nh64)
- #define xph_memsz (size_t)((clazz == ELFCLASS32 \
- ? elf_getu32(swap, ph32.p_memsz) \
- : elf_getu64(swap, ph64.p_memsz)))
- @@ -192,8 +197,8 @@ getu64(int swap, uint64_t value)
- ? prpsoffsets32[i] \
- : prpsoffsets64[i])
- #define xcap_addr (clazz == ELFCLASS32 \
- - ? (void *) &cap32 \
- - : (void *) &cap64)
- + ? (void *)&cap32 \
- + : (void *)&cap64)
- #define xcap_sizeof (clazz == ELFCLASS32 \
- ? sizeof cap32 \
- : sizeof cap64)
- @@ -295,7 +300,7 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
- {
- Elf32_Phdr ph32;
- Elf64_Phdr ph64;
- - size_t offset;
- + size_t offset, len;
- unsigned char nbuf[BUFSIZ];
- ssize_t bufsize;
-
- @@ -309,11 +314,7 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
- * Loop through all the program headers.
- */
- for ( ; num; num--) {
- - if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
- - file_badseek(ms);
- - return -1;
- - }
- - if (read(fd, xph_addr, xph_sizeof) == -1) {
- + if (pread(fd, xph_addr, xph_sizeof, off) == -1) {
- file_badread(ms);
- return -1;
- }
- @@ -331,13 +332,8 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
- * This is a PT_NOTE section; loop through all the notes
- * in the section.
- */
- - if (lseek(fd, xph_offset, SEEK_SET) == (off_t)-1) {
- - file_badseek(ms);
- - return -1;
- - }
- - bufsize = read(fd, nbuf,
- - ((xph_filesz < sizeof(nbuf)) ? xph_filesz : sizeof(nbuf)));
- - if (bufsize == -1) {
- + len = xph_filesz < sizeof(nbuf) ? xph_filesz : sizeof(nbuf);
- + if ((bufsize = pread(fd, nbuf, len, xph_offset)) == -1) {
- file_badread(ms);
- return -1;
- }
- @@ -849,15 +845,16 @@ static const cap_desc_t cap_desc_386[] = {
-
- private int
- doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
- - size_t size, off_t fsize, int *flags, int mach)
- + size_t size, off_t fsize, int *flags, int mach, int strtab)
- {
- Elf32_Shdr sh32;
- Elf64_Shdr sh64;
- int stripped = 1;
- void *nbuf;
- - off_t noff, coff;
- + off_t noff, coff, name_off;
- uint64_t cap_hw1 = 0; /* SunOS 5.x hardware capabilites */
- uint64_t cap_sf1 = 0; /* SunOS 5.x software capabilites */
- + char name[50];
-
- if (size != xsh_sizeof) {
- if (file_printf(ms, ", corrupted section header size") == -1)
- @@ -865,12 +862,19 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
- return 0;
- }
-
- + /* Save offset of name section to be able to read section names later */
- + name_off = off * size * strtab;
- + /* Read the name of this section. */
- + if (pread(fd, name, sizeof(name), name_off + xsh_name) == -1) {
- + file_badread(ms);
- + return -1;
- + }
- + name[sizeof(name) - 1] = '\0';
- + if (strcmp(name, ".debug_info") == 0)
- + stripped = 0;
- +
- 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) {
- + if (pread(fd, xsh_addr, xsh_sizeof, off) == -1) {
- file_badread(ms);
- return -1;
- }
- @@ -895,31 +899,23 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
- /* Things we can determine when we seek */
- switch (xsh_type) {
- case SHT_NOTE:
- - if ((nbuf = malloc((size_t)xsh_size)) == NULL) {
- + if ((nbuf = malloc(xsh_size)) == NULL) {
- file_error(ms, errno, "Cannot allocate memory"
- " for note");
- return -1;
- }
- - if ((noff = lseek(fd, (off_t)xsh_offset, SEEK_SET)) ==
- - (off_t)-1) {
- + if (pread(fd, nbuf, xsh_size, xsh_offset) == -1) {
- file_badread(ms);
- free(nbuf);
- return -1;
- }
- - if (read(fd, nbuf, (size_t)xsh_size) !=
- - (ssize_t)xsh_size) {
- - free(nbuf);
- - file_badread(ms);
- - return -1;
- - }
-
- noff = 0;
- for (;;) {
- if (noff >= (off_t)xsh_size)
- break;
- noff = donote(ms, nbuf, (size_t)noff,
- - (size_t)xsh_size, clazz, swap, 4,
- - flags);
- + xsh_size, clazz, swap, 4, flags);
- if (noff == 0)
- break;
- }
- @@ -1049,7 +1045,7 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
- const char *shared_libraries = "";
- unsigned char nbuf[BUFSIZ];
- ssize_t bufsize;
- - size_t offset, align;
- + size_t offset, align, len;
-
- if (size != xph_sizeof) {
- if (file_printf(ms, ", corrupted program header size") == -1)
- @@ -1058,13 +1054,8 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
- }
-
- for ( ; num; num--) {
- - if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
- - file_badseek(ms);
- - return -1;
- - }
- -
- - if (read(fd, xph_addr, xph_sizeof) == -1) {
- - file_badread(ms);
- + if (pread(fd, xph_addr, xph_sizeof, off) == -1) {
- + file_badread(ms);
- return -1;
- }
-
- @@ -1102,12 +1093,9 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
- * This is a PT_NOTE section; loop through all the notes
- * in the section.
- */
- - if (lseek(fd, xph_offset, SEEK_SET) == (off_t)-1) {
- - file_badseek(ms);
- - return -1;
- - }
- - bufsize = read(fd, nbuf, ((xph_filesz < sizeof(nbuf)) ?
- - xph_filesz : sizeof(nbuf)));
- + len = xph_filesz < sizeof(nbuf) ? xph_filesz
- + : sizeof(nbuf);
- + bufsize = pread(fd, nbuf, len, xph_offset);
- if (bufsize == -1) {
- file_badread(ms);
- return -1;
|