From patchwork Fri Apr 17 19:20:32 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roland McGrath X-Patchwork-Id: 6305 Received: (qmail 54719 invoked by alias); 17 Apr 2015 19:20:37 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 54709 invoked by uid 89); 17 Apr 2015 19:20:36 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY autolearn=no version=3.3.2 X-HELO: topped-with-meat.com MIME-Version: 1.0 From: Roland McGrath To: "Steve Ellcey " Cc: Subject: Re: Build problem with ToT GCC In-Reply-To: Steve Ellcey 's message of Friday, 17 April 2015 11:07:56 -0700 <88baa580-c27b-4fc8-b7da-7de3c0a7f64d@BAMAIL02.ba.imgtec.org> References: <88baa580-c27b-4fc8-b7da-7de3c0a7f64d@BAMAIL02.ba.imgtec.org> Message-Id: <20150417192032.70DE42C3B91@topped-with-meat.com> Date: Fri, 17 Apr 2015 12:20:32 -0700 (PDT) X-CMAE-Score: 0 X-CMAE-Analysis: v=2.1 cv=SvUDtp+0 c=1 sm=1 tr=0 a=WkljmVdYkabdwxfqvArNOQ==:117 a=14OXPxybAAAA:8 a=kj9zAlcOel0A:10 a=hOe2yjtxAAAA:8 a=rxWXYwp4bqm4pF4tegQA:9 a=CjuIK1q_8ugA:10 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 * 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()"));