Deleted Added
sdiff udiff text old ( 276415 ) new ( 277592 )
full compact
1/*
2 * Copyright (c) Christos Zoulas 2008.
3 * All Rights Reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 18 unchanged lines hidden (view full) ---

27 if (nbytes <= sizeof(elfhdr))
28 return 0;
29
30 u.l = 1;
31 (void)memcpy(&elfhdr, buf, sizeof elfhdr);
32 swap = (u.c[sizeof(int32_t) - 1] + 1) != elfhdr.e_ident[EI_DATA];
33
34 type = elf_getu16(swap, elfhdr.e_type);
35 switch (type) {
36#ifdef ELFCORE
37 case ET_CORE:
38 phnum = elf_getu16(swap, elfhdr.e_phnum);
39 if (phnum > ms->elf_phnum_max)
40 return toomany(ms, "program", phnum);
41 flags |= FLAGS_IS_CORE;
42 if (dophn_core(ms, clazz, swap, fd,
43 (off_t)elf_getu(swap, elfhdr.e_phoff), phnum,
44 (size_t)elf_getu16(swap, elfhdr.e_phentsize),
45 fsize, &flags) == -1)
46 return -1;
47 break;
48#endif
49 case ET_EXEC:
50 case ET_DYN:
51 phnum = elf_getu16(swap, elfhdr.e_phnum);
52 if (phnum > ms->elf_phnum_max)
53 return toomany(ms, "program", phnum);
54 shnum = elf_getu16(swap, elfhdr.e_shnum);
55 if (shnum > ms->elf_shnum_max)
56 return toomany(ms, "section", shnum);
57 if (dophn_exec(ms, clazz, swap, fd,
58 (off_t)elf_getu(swap, elfhdr.e_phoff), phnum,
59 (size_t)elf_getu16(swap, elfhdr.e_phentsize),
60 fsize, &flags, shnum) == -1)
61 return -1;
62 /*FALLTHROUGH*/
63 case ET_REL:
64 shnum = elf_getu16(swap, elfhdr.e_shnum);
65 if (shnum > ms->elf_shnum_max)
66 return toomany(ms, "section", shnum);
67 if (doshn(ms, clazz, swap, fd,
68 (off_t)elf_getu(swap, elfhdr.e_shoff), shnum,
69 (size_t)elf_getu16(swap, elfhdr.e_shentsize),
70 fsize, &flags, elf_getu16(swap, elfhdr.e_machine),
71 (int)elf_getu16(swap, elfhdr.e_shstrndx)) == -1)
72 return -1;
73 break;
74
75 default:
76 break;
77 }
78 return 1;