From patchwork Sun May 1 21:50:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fangrui Song X-Patchwork-Id: 53379 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id EB3C73858036 for ; Sun, 1 May 2022 21:51:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org EB3C73858036 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1651441881; bh=I5frCEU7PcsWbyuweF1QzWkonfv0xPGSEw6rgPeUIMo=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=qTle9Mc1msGYRsgKelMEIrpgSZsBfzIo4xfjFm364sNRgTadZuT04OHxqGqOnJXHe 8x/LpitShXHfvtYrBASD1DsTf/GW9u/wXsj+g+GXeDHss5JQg5fw99NKCyMqXiQ592 Qe8l6aglAE4jDR0lN4HlLlaGrdaQ4TZw7YAfVs5k= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-yw1-x1149.google.com (mail-yw1-x1149.google.com [IPv6:2607:f8b0:4864:20::1149]) by sourceware.org (Postfix) with ESMTPS id 8420B3858D33 for ; Sun, 1 May 2022 21:51:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8420B3858D33 Received: by mail-yw1-x1149.google.com with SMTP id 00721157ae682-2f7c011e3e9so121889017b3.23 for ; Sun, 01 May 2022 14:51:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=I5frCEU7PcsWbyuweF1QzWkonfv0xPGSEw6rgPeUIMo=; b=UeSbVGsTsFY6G0jwUfrWhLrVSD88cPcosHeYbAX6RuwOdexiwshzXwEzhw9DZ6eA0T I3QUZ7UaRXGUoX0UbFjz1yl0x6BBRFNZp0DtqgRtSJbfCJWlXkHr2Nt2B1vDMvyiV1Ls UNbn6QRylvczK+wQKm24JUVTRmIfWuyts/906PeRtsQXiN88gqlnZ9JwxCvSPrKpXZgH 5fXG/sZrsYSiEau4dARS2C1Bol95C0UmJkIq1g2YLNOXt0kT6OYEZTYvoxVHANj2nrPr Lk0kXLf/P/biV52UgLQKhqLmaN8RYP6bLWKHw4kxxju3eQgd/1FFWWahAYfR4TEp0m9u CHqQ== X-Gm-Message-State: AOAM531+3xyR6+yK/ye2tPOs77QLKl7PG1twqTNtIQPqmyW3yerUgTN+ LXDkJ5HoG5k3s8rLZBE3BkDMioXv10AaKbj10vPGiqbgZD9Hg2bUUJtuLbdsAwAwgKop5iNqP49 E4XaOXV45Sz8XdUvo8VNDNVCq0mRG3WWcwyr0UMXeWLGnqj0klgPS/iesTZ4CSkBicELS X-Google-Smtp-Source: ABdhPJyjNOnBAB5jtRZzWmiRSOgqIDWYKcbmcG3nqne4PEk37X5ub6lQb8GRQk7vYkh7zsC2ofv2EoGgQT6j X-Received: from maskray1.svl.corp.google.com ([2620:15c:2ce:200:64b6:e3aa:b0d4:aff5]) (user=maskray job=sendgmr) by 2002:a5b:70b:0:b0:648:8079:7657 with SMTP id g11-20020a5b070b000000b0064880797657mr7847794ybq.25.1651441859844; Sun, 01 May 2022 14:50:59 -0700 (PDT) Date: Sun, 1 May 2022 14:50:49 -0700 Message-Id: <20220501215049.2143788-1-maskray@google.com> Mime-Version: 1.0 Subject: [PATCH] elf: Remove fallback to the start of DT_STRTAB for dladdr To: libc-alpha@sourceware.org X-Spam-Status: No, score=-19.5 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Fangrui Song via Libc-alpha From: Fangrui Song Reply-To: Fangrui Song Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" When neither DT_HASH nor DT_GNU_HASH is present, the code scans [DT_SYMTAB, DT_STRTAB). However, there is no guarantee that .dynstr immediately follows .dynsym (e.g. lld typically places .gnu.version after .dynsym). In the absence of a hash table, symbol lookup will always fail (map->l_nbuckets == 0), so it seems appropriate to just bail out. Reviewed-by: Florian Weimer --- elf/dl-addr.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/elf/dl-addr.c b/elf/dl-addr.c index e3c5598e1a..6f5f8eac5c 100644 --- a/elf/dl-addr.c +++ b/elf/dl-addr.c @@ -71,18 +71,10 @@ determine_info (const ElfW(Addr) addr, struct link_map *match, Dl_info *info, } } } - else + else if (match->l_info[DT_HASH] != NULL) { - const ElfW(Sym) *symtabend; - if (match->l_info[DT_HASH] != NULL) - symtabend = (symtab - + ((Elf_Symndx *) D_PTR (match, l_info[DT_HASH]))[1]); - else - /* There is no direct way to determine the number of symbols in the - dynamic symbol table and no hash table is present. The ELF - binary is ill-formed but what shall we do? Use the beginning of - the string table which generally follows the symbol table. */ - symtabend = (const ElfW(Sym) *) strtab; + const ElfW (Sym) *symtabend + = (symtab + ((Elf_Symndx *) D_PTR (match, l_info[DT_HASH]))[1]); for (; (void *) symtab < (void *) symtabend; ++symtab) if ((ELFW(ST_BIND) (symtab->st_info) == STB_GLOBAL @@ -96,6 +88,7 @@ determine_info (const ElfW(Addr) addr, struct link_map *match, Dl_info *info, && symtab->st_name < strtabsize) matchsym = (ElfW(Sym) *) symtab; } + /* In the absence of a hash table, as if the object has no symbol. */ if (mapp) *mapp = match;