From nobody Fri Apr 24 15:29:07 2026 X-Original-To: dev-commits-src-branches@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 4g2H1c4QHtz6bSK6 for ; Fri, 24 Apr 2026 15:29:08 +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" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4g2H1c0LkGz3CyJ for ; Fri, 24 Apr 2026 15:29:08 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777044548; 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=z9ILQBjQM56BY/CFgI9TaPxpkZmpoGaWSA9AAqBB4kE=; b=SMkUmcr7Ue+ZTQHsvTeNPZiaruWMXs9z8VtGHeSVZDOMGqahMCLCwe+O8O/YGlD3vXNcb2 882Mf1UVm2wEQpISYAdc7ltR1CjH0NmK/s5Ai7mNFKtdsccUDFTxPxx7i1y2/Io+wp0pLl X4TNZIZpLft12gmDHsYByYTYSzYN5a9JACdfv2QVsgoJXxID24QV2XIqzPxZr4hc5MlfZi meNJlWC19huSXwJ4hEZGS3tJoirQ5q36hWXjbpEuDG9GpaNhM+CikWwGYLn7Z1eG8Dmp1i hOR+oscsXCBzGA35raDFOAgzpZiem1ANVm8d6S2YJzSiU1QROcLETb96cQgzrg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1777044548; a=rsa-sha256; cv=none; b=D20ocT14hTuljzW8z5/i6CnvYoRY2bF/9cEEpV0ri6X4Xl0cokNUjbhMTLxpFhBP6t6AGt iZw7A1gc/u44zy8ycElEECTECbCW1H+zYv6PghquE5rbbTMsqcdtwyfVgLbO474rtJ5PVn sCsSNkuz8Yy4XKxEDsf2ZWERx93+QmqN5mt9FxB7lkZ6ZvY6mKfA4shRi3ck1rxGsDCm3g TjDtO7FEkJexr+F5ZFthJV4kIvp5APRRcDUK9SirpCsDepuAljIe7snewc1kc9V+DKWdo8 a1DlwhYaSZJ3Qv4NwEtsb2rtMKozW1Kc/TT0dKAJHLpvwWXbSseapgujeC9E/A== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777044548; 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=z9ILQBjQM56BY/CFgI9TaPxpkZmpoGaWSA9AAqBB4kE=; b=KXbwbd9RzsHGF8MWbVYj/KVTABcuUhzxgt7ch6FNx3RNh/XICznZKkENWhxUCNmkiw5Qj9 APVFvFLYDecXIiAzLebF29SB10H5mRjx6mjIjG0+psDrabj0WRbETf3CE/oUEn7BENYU2/ TZ8iQs/+L1plthlc2K9mhvTuxJoCD+m5nn9v4XwlweJHiy73LEozTdcRejccv/hyAgTkIO idQ9k19Kd6cB4EtBk0BGz+qI4ogumBvZKxcqzRQOsylsub6gQ2iI6ZU4sXbm5qIemq4gi9 8GAT9IReVroCkIBl3t+1quDGbaNYhEC9oxq18DitDLq8Fj6T7046dBmQxuy6eQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4g2H1b71cSz17BZ for ; Fri, 24 Apr 2026 15:29:07 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 32e74 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 24 Apr 2026 15:29:07 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: John Baldwin Subject: git: 4bbc38778316 - stable/15 - rtld: Simplify walking program headers List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@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/stable/15 X-Git-Reftype: branch X-Git-Commit: 4bbc38778316711e552ada29bf15c0f850351974 Auto-Submitted: auto-generated Date: Fri, 24 Apr 2026 15:29:07 +0000 Message-Id: <69eb8c43.32e74.7d208cdf@gitrepo.freebsd.org> The branch stable/15 has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=4bbc38778316711e552ada29bf15c0f850351974 commit 4bbc38778316711e552ada29bf15c0f850351974 Author: John Baldwin AuthorDate: 2026-01-14 17:10:33 +0000 Commit: John Baldwin CommitDate: 2026-04-24 15:26:38 +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 (cherry picked from commit 31a440a0e9a26fee109ed753e3493c72b9dc05e9) --- 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 aa17041fdc2d..b987ce4d2a9d 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -1693,7 +1693,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; } @@ -2432,8 +2432,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) { @@ -2495,7 +2494,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); @@ -3015,7 +3014,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; @@ -3397,10 +3396,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); @@ -4395,7 +4394,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); @@ -6213,8 +6212,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;