diff options
author | kaiw <kaiw@FreeBSD.org> | 2010-07-21 10:25:02 +0000 |
---|---|---|
committer | kaiw <kaiw@FreeBSD.org> | 2010-07-21 10:25:02 +0000 |
commit | 49a7d97ce43a82f9cfa863a35ca5cc928d7caf1e (patch) | |
tree | 49e27eb10d72ea7dccf8d6dc7232254e881bb052 /lib/libelf/libelf_phdr.c | |
parent | 800d46f6e4936589dbbae5ddea8fe956c0cc7500 (diff) | |
download | FreeBSD-src-49a7d97ce43a82f9cfa863a35ca5cc928d7caf1e.zip FreeBSD-src-49a7d97ce43a82f9cfa863a35ca5cc928d7caf1e.tar.gz |
Perform additional checks when translating between file and memory
representations of ELF types.
The ELF(3) API allows applications to request a conversion that is
`in-place', i.e., with source and destinations data buffers being
the same. However, the file and memory sizes of ELF sections that
have additional internal structure, such as those of type `Elf_Note',
or `Elf_GNU_Hash_Header', can be determined only known after the
type-specific headers that comprise the first few words in these
sections are read and translated.
Pass in the size of destination buffer to type translation routines
in "libelf_convert.m4" and have these routines return an error code
if the translated data would not fit inside the destination buffer.
Obtained from: elftoolchain
MFC after: 1 month
Diffstat (limited to 'lib/libelf/libelf_phdr.c')
-rw-r--r-- | lib/libelf/libelf_phdr.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/libelf/libelf_phdr.c b/lib/libelf/libelf_phdr.c index fd43851..ed3f650 100644 --- a/lib/libelf/libelf_phdr.c +++ b/lib/libelf/libelf_phdr.c @@ -45,7 +45,7 @@ _libelf_getphdr(Elf *e, int ec) Elf32_Ehdr *eh32; Elf64_Ehdr *eh64; void *ehdr, *phdr; - void (*xlator)(char *_d, char *_s, size_t _c, int _swap); + int (*xlator)(char *_d, size_t _dsz, char *_s, size_t _c, int _swap); assert(ec == ELFCLASS32 || ec == ELFCLASS64); @@ -103,7 +103,7 @@ _libelf_getphdr(Elf *e, int ec) xlator = _libelf_get_translator(ELF_T_PHDR, ELF_TOMEMORY, ec); - (*xlator)(phdr, e->e_rawfile + phoff, phnum, + (*xlator)(phdr, phnum * msz, e->e_rawfile + phoff, phnum, e->e_byteorder != LIBELF_PRIVATE(byteorder)); return (phdr); |