Date: Sat, 10 May 2025 19:33:09 GMT From: Konstantin Belousov <kib@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Subject: git: 5f195cb44bee - stable/14 - rtld: do not call into ifunc resolvers with the bind lock write-locked Message-ID: <202505101933.54AJX9DQ054958@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch stable/14 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=5f195cb44beee2ee952252245937a9bb7a395e38 commit 5f195cb44beee2ee952252245937a9bb7a395e38 Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2025-05-01 15:44:12 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2025-05-10 18:57:45 +0000 rtld: do not call into ifunc resolvers with the bind lock write-locked PR: 286502 (cherry picked from commit c66c0a8479e62f3e3e085252839cddace4d4bbf5) --- libexec/rtld-elf/rtld.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index 6375867d1db1..ba8e2aea6e7c 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -1018,6 +1018,7 @@ _rtld_bind(Obj_Entry *obj, Elf_Size reloff) Elf_Addr target; RtldLockState lockstate; +relock: rlock_acquire(rtld_bind_lock, &lockstate); if (sigsetjmp(lockstate.env, 0) != 0) lock_upgrade(rtld_bind_lock, &lockstate); @@ -1031,10 +1032,15 @@ _rtld_bind(Obj_Entry *obj, Elf_Size reloff) NULL, &lockstate); if (def == NULL) rtld_die(); - if (ELF_ST_TYPE(def->st_info) == STT_GNU_IFUNC) + if (ELF_ST_TYPE(def->st_info) == STT_GNU_IFUNC) { + if (lockstate_wlocked(&lockstate)) { + lock_release(rtld_bind_lock, &lockstate); + goto relock; + } target = (Elf_Addr)rtld_resolve_ifunc(defobj, def); - else + } else { target = (Elf_Addr)(defobj->relocbase + def->st_value); + } dbg("\"%s\" in \"%s\" ==> %p in \"%s\"", defobj->strtab + def->st_name,
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202505101933.54AJX9DQ054958>