elfclass.h (276415) | elfclass.h (277592) |
---|---|
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); | 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 notecount = ms->elf_notes_max; |
|
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) | 36 switch (type) { 37#ifdef ELFCORE 38 case ET_CORE: 39 phnum = elf_getu16(swap, elfhdr.e_phnum); 40 if (phnum > ms->elf_phnum_max) |
40 return toomany(ms, "program", phnum); | 41 return toomany(ms, "program headers", 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), | 42 flags |= FLAGS_IS_CORE; 43 if (dophn_core(ms, clazz, swap, fd, 44 (off_t)elf_getu(swap, elfhdr.e_phoff), phnum, 45 (size_t)elf_getu16(swap, elfhdr.e_phentsize), |
45 fsize, &flags) == -1) | 46 fsize, &flags, ¬ecount) == -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), | 47 return -1; 48 break; 49#endif 50 case ET_EXEC: 51 case ET_DYN: 52 phnum = elf_getu16(swap, elfhdr.e_phnum); 53 if (phnum > ms->elf_phnum_max) 54 return toomany(ms, "program", phnum); 55 shnum = elf_getu16(swap, elfhdr.e_shnum); 56 if (shnum > ms->elf_shnum_max) 57 return toomany(ms, "section", shnum); 58 if (dophn_exec(ms, clazz, swap, fd, 59 (off_t)elf_getu(swap, elfhdr.e_phoff), phnum, 60 (size_t)elf_getu16(swap, elfhdr.e_phentsize), |
60 fsize, &flags, shnum) == -1) | 61 fsize, shnum, &flags, ¬ecount) == -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) | 62 return -1; 63 /*FALLTHROUGH*/ 64 case ET_REL: 65 shnum = elf_getu16(swap, elfhdr.e_shnum); 66 if (shnum > ms->elf_shnum_max) |
66 return toomany(ms, "section", shnum); | 67 return toomany(ms, "section headers", 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), | 68 if (doshn(ms, clazz, swap, fd, 69 (off_t)elf_getu(swap, elfhdr.e_shoff), shnum, 70 (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) | 71 fsize, elf_getu16(swap, elfhdr.e_machine), 72 (int)elf_getu16(swap, elfhdr.e_shstrndx), 73 &flags, ¬ecount) == -1) |
72 return -1; 73 break; 74 75 default: 76 break; 77 } | 74 return -1; 75 break; 76 77 default: 78 break; 79 } |
80 if (notecount == 0) 81 return toomany(ms, "notes", ms->elf_notes_max); |
|
78 return 1; | 82 return 1; |