From nobody Wed Jan 14 17:10:50 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4drt166Rv9z6Ng9L for ; Wed, 14 Jan 2026 17:10:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4drt164YmLz3QNT for ; Wed, 14 Jan 2026 17:10:50 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1768410650; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=L5BV77fTyWLFsvAult7exbn2qIVq7V2gMcKuhh52XWo=; b=HUHYp4s8OHWi7zuvFDU9rXR96nGavy7Z9Qn9OPpP98tiRQB+agQnA0jsbviZuyYWqBges4 sLmTRG0Fdn/pz0OQqTREvTSYXo88jc5MosDKrE2LOSrgjbB3YoqyWTR4qEyfCtZzbxYBQA b+2xozD1TMdU76lFVWvm7lqx86PpotTZzkAbKBYMmv2An1OfAfViLsNtYwcB8820ZujCwe HhVxNZ54N2lLEPPaaW9SI56tZUmjt52LqahYy3vfB5zkAFVmW+si1T0c2mxisU2piKqkW5 ZUBoB101RepVtWyMMFhFTYusLwF6GYuNyhl/eLDbAVyPkbPEjs9jjeEuYoYC8w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1768410650; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=L5BV77fTyWLFsvAult7exbn2qIVq7V2gMcKuhh52XWo=; b=XGwNna0BhgVFmW0YdcHQpfLF1Hk1WuGCGHAkvDaGFJQtHnYR7m3SW7vCubwigInGEcCQ+1 cDy2DREI27kNPfCPZw0dyLlzK3GZa5iEZJyE119JZrPYiTY7OYQUfa+uT95Fa5AeA8vFdH pIjOA0p6SjaU/gNljmm+ANPgEbLvt9BXVSSKTYzakJY7LxpkLVPD8JYhPFyyA8ymNf5pJF Y1JS2nUClWV6hXziBMiBjlDVF10O4tBT6+q5jOFc7DBdL6un8k0ZyRakT0D1Fd+8E/aT1x pGmccf9wiDXBN3km6w6YxDMxL0ingedFJoZ6a07O5HVS+bVxWBEtNaBirBRr/g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1768410650; a=rsa-sha256; cv=none; b=l2IHP9K+dW6CeC7RdrANLRUvX6E35N0som62tmLWLYeAgGetuoGopoz0pMH50inwUJ12YN GO3GQiSIV7YeyPhWgZEi/Lji/XUZLHzB8fRoM1MkZfCdqG68ic9Bxsi62aTW0xa3mnrwJ2 J4Upk1oksevHMyxcSBsTSb7eGwfnClb4xYjvl/bw5pAiWwp/p9S1szd8b3sLeJ8Ekl8dyk VyTLkfFFmPZgKBdKF6FpnvMhJ0OPoDZ33obPJfaA6Y6TyhJA5JNWIJ4yYRFsQMO7wHTfav PZL3v/WqhSUjXxVhwItARo6u3EfiNKaYlTpOoDz0U3Y9vhP1XZ9BvhzDMTOTwA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4drt163rznz15nv for ; Wed, 14 Jan 2026 17:10:50 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 32376 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 14 Jan 2026 17:10:50 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: John Baldwin Subject: git: 31a440a0e9a2 - main - rtld: Simplify walking program headers List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 31a440a0e9a26fee109ed753e3493c72b9dc05e9 Auto-Submitted: auto-generated Date: Wed, 14 Jan 2026 17:10:50 +0000 Message-Id: <6967ce1a.32376.78294266@gitrepo.freebsd.org> The branch main has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=31a440a0e9a26fee109ed753e3493c72b9dc05e9 commit 31a440a0e9a26fee109ed753e3493c72b9dc05e9 Author: John Baldwin AuthorDate: 2026-01-14 17:10:33 +0000 Commit: John Baldwin CommitDate: 2026-01-14 17:10:33 +0000 rtld: Simplify walking program headers Store phnum in Obj_Entry instead of phsize and use that to simplify the terminate expressions when iterating over program headers. Reviewed by: kib Obtained from: CheriBSD Sponsored by: AFRL, DARPA Differential Revision: https://reviews.freebsd.org/D54710 --- libexec/rtld-elf/map_object.c | 2 +- libexec/rtld-elf/powerpc/reloc.c | 4 +--- libexec/rtld-elf/powerpc64/reloc.c | 4 +--- libexec/rtld-elf/rtld.c | 18 ++++++++---------- libexec/rtld-elf/rtld.h | 2 +- 5 files changed, 12 insertions(+), 18 deletions(-) diff --git a/libexec/rtld-elf/map_object.c b/libexec/rtld-elf/map_object.c index 5e5774c0b017..6c6f0c9289b9 100644 --- a/libexec/rtld-elf/map_object.c +++ b/libexec/rtld-elf/map_object.c @@ -318,7 +318,7 @@ map_object(int fd, const char *path, const struct stat *sb, bool ismain) phsize); obj->phdr_alloc = true; } - obj->phsize = phsize; + obj->phnum = phsize / sizeof(*phdr); if (phinterp != NULL) obj->interp = (const char *)(obj->relocbase + phinterp->p_vaddr); diff --git a/libexec/rtld-elf/powerpc/reloc.c b/libexec/rtld-elf/powerpc/reloc.c index c160028cea6d..eb6f50c3c841 100644 --- a/libexec/rtld-elf/powerpc/reloc.c +++ b/libexec/rtld-elf/powerpc/reloc.c @@ -366,9 +366,7 @@ done: * Synchronize icache for executable segments in case we made * any changes. */ - for (phdr = obj->phdr; - (const char *)phdr < (const char *)obj->phdr + obj->phsize; - phdr++) { + for (phdr = obj->phdr; phdr < obj->phdr + obj->phnum; phdr++) { if (phdr->p_type == PT_LOAD && (phdr->p_flags & PF_X) != 0) { __syncicache(obj->relocbase + phdr->p_vaddr, phdr->p_memsz); diff --git a/libexec/rtld-elf/powerpc64/reloc.c b/libexec/rtld-elf/powerpc64/reloc.c index 4a4107aef861..a107da6b0a6a 100644 --- a/libexec/rtld-elf/powerpc64/reloc.c +++ b/libexec/rtld-elf/powerpc64/reloc.c @@ -364,9 +364,7 @@ done: * Synchronize icache for executable segments in case we made * any changes. */ - for (phdr = obj->phdr; - (const char *)phdr < (const char *)obj->phdr + obj->phsize; - phdr++) { + for (phdr = obj->phdr; phdr < obj->phdr + obj->phnum; phdr++) { if (phdr->p_type == PT_LOAD && (phdr->p_flags & PF_X) != 0) { __syncicache(obj->relocbase + phdr->p_vaddr, phdr->p_memsz); diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index 39fb6bc5fb31..7b5f31525853 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -1684,7 +1684,7 @@ digest_phdr(const Elf_Phdr *phdr, int phnum, caddr_t entry, const char *path) continue; obj->phdr = phdr; - obj->phsize = ph->p_memsz; + obj->phnum = ph->p_memsz / sizeof(*ph); obj->relocbase = __DECONST(char *, phdr) - ph->p_vaddr; break; } @@ -2423,8 +2423,7 @@ parse_rtld_phdr(Obj_Entry *obj) first_seg = true; obj->stack_flags = PF_X | PF_R | PF_W; - for (ph = obj->phdr; - (const char *)ph < (const char *)obj->phdr + obj->phsize; ph++) { + for (ph = obj->phdr; ph < obj->phdr + obj->phnum; ph++) { switch (ph->p_type) { case PT_LOAD: if (first_seg) { @@ -2486,7 +2485,7 @@ init_rtld(caddr_t mapbase, Elf_Auxinfo **aux_info) ehdr = (Elf_Ehdr *)mapbase; objtmp.phdr = (Elf_Phdr *)((char *)mapbase + ehdr->e_phoff); - objtmp.phsize = ehdr->e_phnum * sizeof(objtmp.phdr[0]); + objtmp.phnum = ehdr->e_phnum; /* Initialize the object list. */ TAILQ_INIT(&obj_list); @@ -2998,7 +2997,7 @@ load_kpreload(const void *addr) obj = obj_new(); phdr = (const Elf_Phdr *)((const char *)addr + ehdr->e_phoff); obj->phdr = phdr; - obj->phsize = ehdr->e_phnum * sizeof(*phdr); + obj->phnum = ehdr->e_phnum; phlimit = phdr + ehdr->e_phnum; seg0 = segn = NULL; @@ -3380,10 +3379,10 @@ reloc_textrel_prot(Obj_Entry *obj, bool before) { const Elf_Phdr *ph; void *base; - size_t l, sz; + size_t sz; int prot; - for (l = obj->phsize / sizeof(*ph), ph = obj->phdr; l > 0; l--, ph++) { + for (ph = obj->phdr; ph < obj->phdr + obj->phnum; ph++) { if (ph->p_type != PT_LOAD || (ph->p_flags & PF_W) != 0) continue; base = obj->relocbase + rtld_trunc_page(ph->p_vaddr); @@ -4331,7 +4330,7 @@ rtld_fill_dl_phdr_info(const Obj_Entry *obj, struct dl_phdr_info *phdr_info) phdr_info->dlpi_addr = (Elf_Addr)obj->relocbase; phdr_info->dlpi_name = obj->path; phdr_info->dlpi_phdr = obj->phdr; - phdr_info->dlpi_phnum = obj->phsize / sizeof(obj->phdr[0]); + phdr_info->dlpi_phnum = obj->phnum; phdr_info->dlpi_tls_modid = obj->tlsindex; phdr_info->dlpi_tls_data = (char *)tls_get_addr_slow(_tcb_get(), obj->tlsindex, 0, true); @@ -6149,8 +6148,7 @@ obj_remap_relro(Obj_Entry *obj, int prot) caddr_t relro_page; size_t relro_size; - for (ph = obj->phdr; (const char *)ph < (const char *)obj->phdr + - obj->phsize; ph++) { + for (ph = obj->phdr; ph < obj->phdr + obj->phnum; ph++) { if (ph->p_type != PT_GNU_RELRO) continue; relro_page = obj->relocbase + rtld_trunc_page(ph->p_vaddr); diff --git a/libexec/rtld-elf/rtld.h b/libexec/rtld-elf/rtld.h index d4829b17cebb..023e9af9a2a8 100644 --- a/libexec/rtld-elf/rtld.h +++ b/libexec/rtld-elf/rtld.h @@ -152,7 +152,7 @@ typedef struct Struct_Obj_Entry { const Elf_Dyn *dynamic; /* Dynamic section */ caddr_t entry; /* Entry point */ const Elf_Phdr *phdr; /* Program header if it is mapped, else NULL */ - size_t phsize; /* Size of program header in bytes */ + size_t phnum; /* Number of program headers */ const char *interp; /* Pathname of the interpreter, if any */ Elf_Word stack_flags;