summaryrefslogtreecommitdiff
path: root/ext/fileinfo/libmagic/readelf.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/fileinfo/libmagic/readelf.c')
-rw-r--r--ext/fileinfo/libmagic/readelf.c240
1 files changed, 34 insertions, 206 deletions
diff --git a/ext/fileinfo/libmagic/readelf.c b/ext/fileinfo/libmagic/readelf.c
index 8ee5b8bd9b..e7f404db6d 100644
--- a/ext/fileinfo/libmagic/readelf.c
+++ b/ext/fileinfo/libmagic/readelf.c
@@ -46,9 +46,8 @@ private int dophn_core(struct magic_set *, int, int, int, off_t, int, size_t,
off_t, int *);
#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);
+ off_t, int *);
+private int doshn(struct magic_set *, int, int, int, off_t, int, size_t, int *);
private size_t donote(struct magic_set *, unsigned char *, size_t, size_t, int,
int, size_t, int *);
@@ -135,74 +134,62 @@ getu64(int swap, uint64_t value)
# define elf_getu64(swap, value) getu64(swap, value)
#endif
-#define xsh_addr (clazz == ELFCLASS32 \
+#define xsh_addr (class == ELFCLASS32 \
? (void *) &sh32 \
: (void *) &sh64)
-#define xsh_sizeof (clazz == ELFCLASS32 \
+#define xsh_sizeof (class == ELFCLASS32 \
? sizeof sh32 \
: sizeof sh64)
-#define xsh_size (clazz == ELFCLASS32 \
+#define xsh_size (class == ELFCLASS32 \
? elf_getu32(swap, sh32.sh_size) \
: elf_getu64(swap, sh64.sh_size))
-#define xsh_offset (clazz == ELFCLASS32 \
+#define xsh_offset (class == ELFCLASS32 \
? elf_getu32(swap, sh32.sh_offset) \
: elf_getu64(swap, sh64.sh_offset))
-#define xsh_type (clazz == ELFCLASS32 \
+#define xsh_type (class == ELFCLASS32 \
? elf_getu32(swap, sh32.sh_type) \
: elf_getu32(swap, sh64.sh_type))
-#define xph_addr (clazz == ELFCLASS32 \
+#define xph_addr (class == ELFCLASS32 \
? (void *) &ph32 \
: (void *) &ph64)
-#define xph_sizeof (clazz == ELFCLASS32 \
+#define xph_sizeof (class == ELFCLASS32 \
? sizeof ph32 \
: sizeof ph64)
-#define xph_type (clazz == ELFCLASS32 \
+#define xph_type (class == ELFCLASS32 \
? elf_getu32(swap, ph32.p_type) \
: elf_getu32(swap, ph64.p_type))
-#define xph_offset (off_t)(clazz == ELFCLASS32 \
+#define xph_offset (off_t)(class == ELFCLASS32 \
? elf_getu32(swap, ph32.p_offset) \
: elf_getu64(swap, ph64.p_offset))
-#define xph_align (size_t)((clazz == ELFCLASS32 \
+#define xph_align (size_t)((class == ELFCLASS32 \
? (off_t) (ph32.p_align ? \
elf_getu32(swap, ph32.p_align) : 4) \
: (off_t) (ph64.p_align ? \
elf_getu64(swap, ph64.p_align) : 4)))
-#define xph_filesz (size_t)((clazz == ELFCLASS32 \
+#define xph_filesz (size_t)((class == ELFCLASS32 \
? elf_getu32(swap, ph32.p_filesz) \
: elf_getu64(swap, ph64.p_filesz)))
-#define xnh_addr (clazz == ELFCLASS32 \
+#define xnh_addr (class == ELFCLASS32 \
? (void *) &nh32 \
: (void *) &nh64)
-#define xph_memsz (size_t)((clazz == ELFCLASS32 \
+#define xph_memsz (size_t)((class == ELFCLASS32 \
? elf_getu32(swap, ph32.p_memsz) \
: elf_getu64(swap, ph64.p_memsz)))
-#define xnh_sizeof (clazz == ELFCLASS32 \
+#define xnh_sizeof (class == ELFCLASS32 \
? sizeof nh32 \
: sizeof nh64)
-#define xnh_type (clazz == ELFCLASS32 \
+#define xnh_type (class == ELFCLASS32 \
? elf_getu32(swap, nh32.n_type) \
: elf_getu32(swap, nh64.n_type))
-#define xnh_namesz (clazz == ELFCLASS32 \
+#define xnh_namesz (class == ELFCLASS32 \
? elf_getu32(swap, nh32.n_namesz) \
: elf_getu32(swap, nh64.n_namesz))
-#define xnh_descsz (clazz == ELFCLASS32 \
+#define xnh_descsz (class == ELFCLASS32 \
? elf_getu32(swap, nh32.n_descsz) \
: elf_getu32(swap, nh64.n_descsz))
-#define prpsoffsets(i) (clazz == ELFCLASS32 \
+#define prpsoffsets(i) (class == ELFCLASS32 \
? prpsoffsets32[i] \
: prpsoffsets64[i])
-#define xcap_addr (clazz == ELFCLASS32 \
- ? (void *) &cap32 \
- : (void *) &cap64)
-#define xcap_sizeof (clazz == ELFCLASS32 \
- ? sizeof cap32 \
- : sizeof cap64)
-#define xcap_tag (clazz == ELFCLASS32 \
- ? elf_getu32(swap, cap32.c_tag) \
- : elf_getu64(swap, cap64.c_tag))
-#define xcap_val (clazz == ELFCLASS32 \
- ? elf_getu32(swap, cap32.c_un.c_val) \
- : elf_getu64(swap, cap64.c_un.c_val))
#ifdef ELFCORE
/*
@@ -242,7 +229,7 @@ static const size_t prpsoffsets64[] = {
#define NOFFSETS32 (sizeof prpsoffsets32 / sizeof prpsoffsets32[0])
#define NOFFSETS64 (sizeof prpsoffsets64 / sizeof prpsoffsets64[0])
-#define NOFFSETS (clazz == ELFCLASS32 ? NOFFSETS32 : NOFFSETS64)
+#define NOFFSETS (class == ELFCLASS32 ? NOFFSETS32 : NOFFSETS64)
/*
* Look through the program headers of an executable image, searching
@@ -288,7 +275,7 @@ private const char os_style_names[][8] = {
#define FLAGS_DID_CORE_STYLE 4
private int
-dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
+dophn_core(struct magic_set *ms, int class, int swap, int fd, off_t off,
int num, size_t size, off_t fsize, int *flags)
{
Elf32_Phdr ph32;
@@ -353,7 +340,7 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
if (offset >= (size_t)bufsize)
break;
offset = donote(ms, nbuf, offset, (size_t)bufsize,
- clazz, swap, 4, flags);
+ class, swap, 4, flags);
if (offset == 0)
break;
@@ -365,7 +352,7 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
private size_t
donote(struct magic_set *ms, unsigned char *nbuf, size_t offset, size_t size,
- int clazz, int swap, size_t align, int *flags)
+ int class, int swap, size_t align, int *flags)
{
Elf32_Nhdr nh32;
Elf64_Nhdr nh64;
@@ -763,67 +750,15 @@ core:
return offset;
}
-/* SunOS 5.x hardware capability descriptions */
-typedef struct cap_desc {
- uint64_t cd_mask;
- const char *cd_name;
-} cap_desc_t;
-
-static const cap_desc_t cap_desc_sparc[] = {
- { AV_SPARC_MUL32, "MUL32" },
- { AV_SPARC_DIV32, "DIV32" },
- { AV_SPARC_FSMULD, "FSMULD" },
- { AV_SPARC_V8PLUS, "V8PLUS" },
- { AV_SPARC_POPC, "POPC" },
- { AV_SPARC_VIS, "VIS" },
- { AV_SPARC_VIS2, "VIS2" },
- { AV_SPARC_ASI_BLK_INIT, "ASI_BLK_INIT" },
- { AV_SPARC_FMAF, "FMAF" },
- { AV_SPARC_FJFMAU, "FJFMAU" },
- { AV_SPARC_IMA, "IMA" },
- { 0, NULL }
-};
-
-static const cap_desc_t cap_desc_386[] = {
- { AV_386_FPU, "FPU" },
- { AV_386_TSC, "TSC" },
- { AV_386_CX8, "CX8" },
- { AV_386_SEP, "SEP" },
- { AV_386_AMD_SYSC, "AMD_SYSC" },
- { AV_386_CMOV, "CMOV" },
- { AV_386_MMX, "MMX" },
- { AV_386_AMD_MMX, "AMD_MMX" },
- { AV_386_AMD_3DNow, "AMD_3DNow" },
- { AV_386_AMD_3DNowx, "AMD_3DNowx" },
- { AV_386_FXSR, "FXSR" },
- { AV_386_SSE, "SSE" },
- { AV_386_SSE2, "SSE2" },
- { AV_386_PAUSE, "PAUSE" },
- { AV_386_SSE3, "SSE3" },
- { AV_386_MON, "MON" },
- { AV_386_CX16, "CX16" },
- { AV_386_AHF, "AHF" },
- { AV_386_TSCP, "TSCP" },
- { AV_386_AMD_SSE4A, "AMD_SSE4A" },
- { AV_386_POPCNT, "POPCNT" },
- { AV_386_AMD_LZCNT, "AMD_LZCNT" },
- { AV_386_SSSE3, "SSSE3" },
- { AV_386_SSE4_1, "SSE4.1" },
- { AV_386_SSE4_2, "SSE4.2" },
- { 0, NULL }
-};
-
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)
+doshn(struct magic_set *ms, int class, int swap, int fd, off_t off, int num,
+ size_t size, int *flags)
{
Elf32_Shdr sh32;
Elf64_Shdr sh64;
int stripped = 1;
void *nbuf;
off_t noff;
- uint64_t cap_hw1 = 0; /* SunOS 5.x hardware capabilites */
- uint64_t cap_sf1 = 0; /* SunOS 5.x software capabilites */
if (size != xsh_sizeof) {
if (file_printf(ms, ", corrupted section header size") == -1)
@@ -873,7 +808,7 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
if (noff >= (size_t)xsh_size)
break;
noff = donote(ms, nbuf, (size_t)noff,
- (size_t)xsh_size, clazz, swap, 4,
+ (size_t)xsh_size, class, swap, 4,
flags);
if (noff == 0)
break;
@@ -885,115 +820,10 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
}
efree(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);
- return -1;
- }
- coff = 0;
- for (;;) {
- Elf32_Cap cap32;
- Elf64_Cap cap64;
- char cbuf[MAX(sizeof cap32, sizeof cap64)];
- if ((coff += xcap_sizeof) >= (size_t)xsh_size)
- break;
- if (read(fd, cbuf, (size_t)xcap_sizeof) !=
- (ssize_t)xcap_sizeof) {
- file_badread(ms);
- return -1;
- }
- (void)memcpy(xcap_addr, cbuf, xcap_sizeof);
- switch (xcap_tag) {
- case CA_SUNW_NULL:
- break;
- case CA_SUNW_HW_1:
- cap_hw1 |= xcap_val;
- break;
- case CA_SUNW_SF_1:
- cap_sf1 |= xcap_val;
- break;
- default:
- if (file_printf(ms,
- ", with unknown capability "
- "0x%llx = 0x%llx",
- xcap_tag, xcap_val) == -1)
- return -1;
- break;
- }
- }
- if (lseek(fd, off, SEEK_SET) == (off_t)-1) {
- file_badread(ms);
- return -1;
- }
- break;
- }
}
}
if (file_printf(ms, ", %sstripped", stripped ? "" : "not ") == -1)
return -1;
- if (cap_hw1) {
- const cap_desc_t *cdp;
- switch (mach) {
- case EM_SPARC:
- case EM_SPARC32PLUS:
- case EM_SPARCV9:
- cdp = cap_desc_sparc;
- break;
- case EM_386:
- case EM_IA_64:
- case EM_AMD64:
- cdp = cap_desc_386;
- break;
- default:
- cdp = NULL;
- break;
- }
- if (file_printf(ms, ", uses") == -1)
- return -1;
- if (cdp) {
- while (cdp->cd_name) {
- if (cap_hw1 & cdp->cd_mask) {
- if (file_printf(ms,
- " %s", cdp->cd_name) == -1)
- return -1;
- cap_hw1 &= ~cdp->cd_mask;
- }
- ++cdp;
- }
- if (cap_hw1)
- if (file_printf(ms,
- " unknown hardware capability 0x%llx",
- cap_hw1) == -1)
- return -1;
- } else {
- if (file_printf(ms,
- " hardware capability 0x%llx", cap_hw1) == -1)
- return -1;
- }
- }
- if (cap_sf1) {
- if (cap_sf1 & SF1_SUNW_FPUSED) {
- if (file_printf(ms,
- (cap_sf1 & SF1_SUNW_FPKNWN)
- ? ", uses frame pointer"
- : ", not known to use frame pointer") == -1)
- return -1;
- }
- cap_sf1 &= ~SF1_SUNW_MASK;
- if (cap_sf1)
- if (file_printf(ms,
- ", with unknown software capability 0x%llx",
- cap_sf1) == -1)
- return -1;
- }
return 0;
}
@@ -1003,8 +833,8 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
* otherwise it's statically linked.
*/
private int
-dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
- int num, size_t size, off_t fsize, int *flags, int sh_num)
+dophn_exec(struct magic_set *ms, int class, int swap, int fd, off_t off,
+ int num, size_t size, off_t fsize, int *flags)
{
Elf32_Phdr ph32;
Elf64_Phdr ph64;
@@ -1073,8 +903,6 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
return -1;
align = 4;
}
- if (sh_num)
- break;
/*
* This is a PT_NOTE section; loop through all the notes
* in the section.
@@ -1095,7 +923,7 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
if (offset >= (size_t)bufsize)
break;
offset = donote(ms, nbuf, offset,
- (size_t)bufsize, clazz, swap, align,
+ (size_t)bufsize, class, swap, align,
flags);
if (offset == 0)
break;
@@ -1123,7 +951,7 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf,
int32_t l;
char c[sizeof (int32_t)];
} u;
- int clazz;
+ int class;
int swap;
struct stat st;
off_t fsize;
@@ -1159,9 +987,9 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf,
}
fsize = st.st_size;
- clazz = buf[EI_CLASS];
+ class = buf[EI_CLASS];
- switch (clazz) {
+ switch (class) {
case ELFCLASS32:
#undef elf_getu
#define elf_getu(a, b) elf_getu32(a, b)
@@ -1175,7 +1003,7 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf,
#define elfhdr elf64hdr
#include "elfclass.h"
default:
- if (file_printf(ms, ", unknown class %d", clazz) == -1)
+ if (file_printf(ms, ", unknown class %d", class) == -1)
return -1;
break;
}