diff --git a/ldso/dynlink.c b/ldso/dynlink.c index ad49cac2..c6890845 100644 --- a/ldso/dynlink.c +++ b/ldso/dynlink.c @@ -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; diff --git a/src/internal/vdso.c b/src/internal/vdso.c index a4862171..d46d3228 100644 --- a/src/internal/vdso.c +++ b/src/internal/vdso.c @@ -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;