treat null vdso base same as missing

On s390x, the kernel provides AT_SYSINFO_EHDR, but sets it to zero, if the
program being run does not have a program interpreter.  This causes
problems when running the dynamic linker directly.
This commit is contained in:
Bobby Bingham 2016-07-25 22:52:58 -05:00 committed by Rich Felker
parent b418ea1b66
commit 54482898ab
2 changed files with 2 additions and 1 deletions

View File

@ -1550,7 +1550,7 @@ _Noreturn void __dls3(size_t *sp)
}
/* Attach to vdso, if provided by the kernel */
if (search_vec(auxv, &vdso_base, AT_SYSINFO_EHDR)) {
if (search_vec(auxv, &vdso_base, AT_SYSINFO_EHDR) && vdso_base) {
Ehdr *ehdr = (void *)vdso_base;
Phdr *phdr = vdso.phdr = (void *)(vdso_base + ehdr->e_phoff);
vdso.phnum = ehdr->e_phnum;

View File

@ -45,6 +45,7 @@ void *__vdsosym(const char *vername, const char *name)
size_t i;
for (i=0; libc.auxv[i] != AT_SYSINFO_EHDR; i+=2)
if (!libc.auxv[i]) return 0;
if (!libc.auxv[i+1]) return 0;
Ehdr *eh = (void *)libc.auxv[i+1];
Phdr *ph = (void *)((char *)eh + eh->e_phoff);
size_t *dynv=0, base=-1;