This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: Build problem with ToT GCC
- From: Roland McGrath <roland at hack dot frob dot com>
- To: "Steve Ellcey " <sellcey at imgtec dot com>
- Cc: <libc-alpha at sourceware dot org>
- Date: Fri, 17 Apr 2015 12:20:32 -0700 (PDT)
- Subject: Re: Build problem with ToT GCC
- Authentication-results: sourceware.org; auth=none
- References: <88baa580-c27b-4fc8-b7da-7de3c0a7f64d at BAMAIL02 dot ba dot imgtec dot org>
Can you try this change (on branch roland/dl-nns) with that compiler?
I suspect a compile-time constant preventing evaluation of the
expressions doing indexing will avoid the warning. If it doesn't,
then the right thing to do is to put that inside #if DL_NNS > 1.
While I was there I noticed that it's not properly checking for wildly
bogus NSID values that would make that indexing bogus at runtime (in
the SHARED case), so I put that in too.
Thanks,
Roland
2015-04-17 Roland McGrath <roland@hack.frob.com>
* elf/dl-open.c (_dl_open): Use __glibc_unlikely in invalid namespace
check. Reject NSID < 0 and NSID >= dl_nns, and check for DL_NNS==1,
before using NSID as an index.
diff --git a/elf/dl-open.c b/elf/dl-open.c
index 0dbe07f..2d0e082 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -619,8 +619,14 @@ no more namespaces available for dlmopen()"));
/* Never allow loading a DSO in a namespace which is empty. Such
direct placements is only causing problems. Also don't allow
loading into a namespace used for auditing. */
- else if (__builtin_expect (nsid != LM_ID_BASE && nsid != __LM_ID_CALLER, 0)
- && (GL(dl_ns)[nsid]._ns_nloaded == 0
+ else if (__glibc_unlikely (nsid != LM_ID_BASE && nsid != __LM_ID_CALLER)
+ && (__glibc_unlikely (nsid < 0 || nsid >= GL(dl_nns))
+ /* This prevents the [NSID] index expressions from being
+ evaluated, so the compiler won't think that we are
+ accessing an invalid index here in the !SHARED case where
+ DL_NNS is 1 and so any NSID != 0 is invalid. */
+ || DL_NNS == 1
+ || GL(dl_ns)[nsid]._ns_nloaded == 0
|| GL(dl_ns)[nsid]._ns_loaded->l_auditing))
_dl_signal_error (EINVAL, file, NULL,
N_("invalid target namespace in dlmopen()"));