Commit 9eb043b4 authored by Dmitry Safonov's avatar Dmitry Safonov Committed by Pavel Emelyanov

pie/util-vdso: split parse_elf_phdr from vdso_fill_symtable

Impact: no functional changes, cleanup
Signed-off-by: 's avatarDmitry Safonov <dsafonov@virtuozzo.com>
Reviewed-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 4c69339c
...@@ -91,32 +91,13 @@ static int has_elf_identity(Ehdr_t *ehdr) ...@@ -91,32 +91,13 @@ static int has_elf_identity(Ehdr_t *ehdr)
return true; return true;
} }
int vdso_fill_symtable(uintptr_t mem, size_t size, struct vdso_symtable *t) static int parse_elf_phdr(uintptr_t mem, size_t size,
Phdr_t **dynamic, Phdr_t **load)
{ {
const char *vdso_symbols[VDSO_SYMBOL_MAX] = {
ARCH_VDSO_SYMBOLS
};
Phdr_t *dynamic = NULL, *load = NULL;
Ehdr_t *ehdr = (void *)mem; Ehdr_t *ehdr = (void *)mem;
Dyn_t *dyn_strtab = NULL;
Dyn_t *dyn_symtab = NULL;
Dyn_t *dyn_strsz = NULL;
Dyn_t *dyn_syment = NULL;
Dyn_t *dyn_hash = NULL;
Word_t *hash = NULL;
Phdr_t *phdr;
Dyn_t *d;
Word_t *bucket, *chain;
Word_t nbucket, nchain;
uintptr_t addr; uintptr_t addr;
Phdr_t *phdr;
char *dynsymbol_names; int i;
unsigned int i, j, k;
pr_debug("Parsing at %lx %lx\n", (long)mem, (long)mem + (long)size);
if (__ptr_struct_end_oob(mem, sizeof(Ehdr_t), mem, size)) if (__ptr_struct_end_oob(mem, sizeof(Ehdr_t), mem, size))
goto err_oob; goto err_oob;
...@@ -126,9 +107,6 @@ int vdso_fill_symtable(uintptr_t mem, size_t size, struct vdso_symtable *t) ...@@ -126,9 +107,6 @@ int vdso_fill_symtable(uintptr_t mem, size_t size, struct vdso_symtable *t)
if (!has_elf_identity(ehdr)) if (!has_elf_identity(ehdr))
return -EINVAL; return -EINVAL;
/*
* We need PT_LOAD and PT_DYNAMIC here. Each once.
*/
addr = mem + ehdr->e_phoff; addr = mem + ehdr->e_phoff;
if (__ptr_oob(addr, mem, size)) if (__ptr_oob(addr, mem, size))
goto err_oob; goto err_oob;
...@@ -140,22 +118,60 @@ int vdso_fill_symtable(uintptr_t mem, size_t size, struct vdso_symtable *t) ...@@ -140,22 +118,60 @@ int vdso_fill_symtable(uintptr_t mem, size_t size, struct vdso_symtable *t)
phdr = (void *)addr; phdr = (void *)addr;
switch (phdr->p_type) { switch (phdr->p_type) {
case PT_DYNAMIC: case PT_DYNAMIC:
if (dynamic) { if (*dynamic) {
pr_err("Second PT_DYNAMIC header\n"); pr_err("Second PT_DYNAMIC header\n");
return -EINVAL; return -EINVAL;
} }
dynamic = phdr; *dynamic = phdr;
break; break;
case PT_LOAD: case PT_LOAD:
if (load) { if (*load) {
pr_err("Second PT_LOAD header\n"); pr_err("Second PT_LOAD header\n");
return -EINVAL; return -EINVAL;
} }
load = phdr; *load = phdr;
break; break;
} }
} }
return 0;
err_oob:
pr_err("Corrupted Elf phdr\n");
return -EFAULT;
}
int vdso_fill_symtable(uintptr_t mem, size_t size, struct vdso_symtable *t)
{
const char *vdso_symbols[VDSO_SYMBOL_MAX] = {
ARCH_VDSO_SYMBOLS
};
Phdr_t *dynamic = NULL, *load = NULL;
Dyn_t *dyn_strtab = NULL;
Dyn_t *dyn_symtab = NULL;
Dyn_t *dyn_strsz = NULL;
Dyn_t *dyn_syment = NULL;
Dyn_t *dyn_hash = NULL;
Word_t *hash = NULL;
Dyn_t *d;
Word_t *bucket, *chain;
Word_t nbucket, nchain;
uintptr_t addr;
int ret;
char *dynsymbol_names;
unsigned int i, j, k;
pr_debug("Parsing at %lx %lx\n", (long)mem, (long)mem + (long)size);
/*
* We need PT_LOAD and PT_DYNAMIC here. Each once.
*/
ret = parse_elf_phdr(mem, size, &dynamic, &load);
if (ret < 0)
return ret;
if (!load || !dynamic) { if (!load || !dynamic) {
pr_err("One of obligated program headers is missed\n"); pr_err("One of obligated program headers is missed\n");
return -EINVAL; return -EINVAL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment