From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/10336 Path: news.gmane.org!not-for-mail From: Bobby Bingham Newsgroups: gmane.linux.lib.musl.general Subject: [PATCH 1/3] treat null vdso base same as missing Date: Mon, 25 Jul 2016 22:52:58 -0500 Message-ID: <20160726035300.10255-1-koorogi@koorogi.info> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org X-Trace: ger.gmane.org 1469505229 22437 80.91.229.3 (26 Jul 2016 03:53:49 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 26 Jul 2016 03:53:49 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-10347-gllmg-musl=m.gmane.org@lists.openwall.com Tue Jul 26 05:53:36 2016 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1bRtR0-0003uE-9Z for gllmg-musl@m.gmane.org; Tue, 26 Jul 2016 05:53:34 +0200 Original-Received: (qmail 9412 invoked by uid 550); 26 Jul 2016 03:53:29 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Original-Received: (qmail 9339 invoked from network); 26 Jul 2016 03:53:19 -0000 X-Mailer: git-send-email 2.9.0 Xref: news.gmane.org gmane.linux.lib.musl.general:10336 Archived-At: 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