From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gnu.wildebeest.org (gnu.wildebeest.org [45.83.234.184]) by sourceware.org (Postfix) with ESMTPS id 185713858429 for ; Sun, 28 Aug 2022 18:11:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 185713858429 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=klomp.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=klomp.org Received: from reform (deer0x16.wildebeest.org [172.31.17.152]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by gnu.wildebeest.org (Postfix) with ESMTPSA id CA4CA302FB88; Sun, 28 Aug 2022 20:11:29 +0200 (CEST) Received: by reform (Postfix, from userid 1000) id 7AA532E82341; Sun, 28 Aug 2022 20:11:29 +0200 (CEST) From: Mark Wielaard To: elfutils-devel@sourceware.org Cc: Mark Wielaard Subject: [PATCH] libelf: Correctly decode ar_mode as octal string Date: Sun, 28 Aug 2022 20:10:34 +0200 Message-Id: <20220828181034.115031-1-mark@klomp.org> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-11.3 required=5.0 tests=BAYES_00,GIT_PATCH_0,JMQ_SPF_NEUTRAL,KAM_DMARC_STATUS,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: ar_mode is encoded as an octal ascii string, not decimal. Add a new OCT_FIELD macro to decode it. Signed-off-by: Mark Wielaard --- This was found by the run-ar-N.sh testcase on the try builder. libelf/ChangeLog | 5 +++++ libelf/elf_begin.c | 25 +++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/libelf/ChangeLog b/libelf/ChangeLog index 35f49516..558d795e 100644 --- a/libelf/ChangeLog +++ b/libelf/ChangeLog @@ -1,3 +1,8 @@ +2022-08-28 Mark Wielaard + + * elf_begin.c (__libelf_next_arhdr_wrlock): Add OCT_FIELD macro, + like INT_FIELD but use strtol with octal base 8. Use for ar_mode. + 2022-08-08 Andreas Schwab * elf.h: Update from glibc. diff --git a/libelf/elf_begin.c b/libelf/elf_begin.c index 17d9b1f3..71eb3594 100644 --- a/libelf/elf_begin.c +++ b/libelf/elf_begin.c @@ -977,7 +977,8 @@ __libelf_next_arhdr_wrlock (Elf *elf) atoll depending on the size of the types. We are also prepared for the case where the whole field in the `struct ar_hdr' is filled in which case we cannot simply use atol/l but instead have - to create a temporary copy. */ + to create a temporary copy. Note that all fields use decimal + encoding, except ar_mode which uses octal. */ #define INT_FIELD(FIELD) \ do \ @@ -997,10 +998,30 @@ __libelf_next_arhdr_wrlock (Elf *elf) } \ while (0) +#define OCT_FIELD(FIELD) \ + do \ + { \ + char buf[sizeof (ar_hdr->FIELD) + 1]; \ + const char *string = ar_hdr->FIELD; \ + if (ar_hdr->FIELD[sizeof (ar_hdr->FIELD) - 1] != ' ') \ + { \ + *((char *) mempcpy (buf, ar_hdr->FIELD, sizeof (ar_hdr->FIELD))) \ + = '\0'; \ + string = buf; \ + } \ + if (sizeof (elf_ar_hdr->FIELD) <= sizeof (long int)) \ + elf_ar_hdr->FIELD \ + = (__typeof (elf_ar_hdr->FIELD)) strtol (string, NULL, 8); \ + else \ + elf_ar_hdr->FIELD \ + = (__typeof (elf_ar_hdr->FIELD)) strtoll (string, NULL, 8); \ + } \ + while (0) + INT_FIELD (ar_date); INT_FIELD (ar_uid); INT_FIELD (ar_gid); - INT_FIELD (ar_mode); + OCT_FIELD (ar_mode); INT_FIELD (ar_size); if (elf_ar_hdr->ar_size < 0) -- 2.30.2