|
|
Message-Id: <20160726035300.10255-1-koorogi@koorogi.info>
Date: Mon, 25 Jul 2016 22:52:58 -0500
From: Bobby Bingham <koorogi@...rogi.info>
To: musl@...ts.openwall.com
Subject: [PATCH 1/3] 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.
---
ldso/dynlink.c | 2 +-
src/internal/vdso.c | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/ldso/dynlink.c b/ldso/dynlink.c
index e458f38..5a9e2ba 100644
--- a/ldso/dynlink.c
+++ b/ldso/dynlink.c
@@ -1549,7 +1549,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 6ae0212..ff392bc 100644
--- a/src/internal/vdso.c
+++ b/src/internal/vdso.c
@@ -44,6 +44,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;
--
2.9.0
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.