git: 25bd87539704 - stable/14 - rtld: ignore load_filtees() calls if we already loading filtees for the obj
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 18 Feb 2024 10:09:11 UTC
The branch stable/14 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=25bd87539704b65a4720c1d46cfec5557c4817de
commit 25bd87539704b65a4720c1d46cfec5557c4817de
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2024-02-13 01:09:03 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2024-02-18 10:01:47 +0000
rtld: ignore load_filtees() calls if we already loading filtees for the obj
(cherry picked from commit 968a18975adc9c2a619bb52aa2f009de99fc9e24)
---
libexec/rtld-elf/rtld.c | 4 +++-
libexec/rtld-elf/rtld.h | 1 +
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index e71903ba5e12..d32c80debc1d 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -2572,12 +2572,14 @@ load_filtee1(Obj_Entry *obj, Needed_Entry *needed, int flags,
static void
load_filtees(Obj_Entry *obj, int flags, RtldLockState *lockstate)
{
- if (obj->filtees_loaded)
+ if (obj->filtees_loaded || obj->filtees_loading)
return;
lock_restart_for_upgrade(lockstate);
+ obj->filtees_loading = true;
load_filtee1(obj, obj->needed_filtees, flags, lockstate);
load_filtee1(obj, obj->needed_aux_filtees, flags, lockstate);
obj->filtees_loaded = true;
+ obj->filtees_loading = false;
}
static int
diff --git a/libexec/rtld-elf/rtld.h b/libexec/rtld-elf/rtld.h
index c2676f59f32d..c9e0d4ab0525 100644
--- a/libexec/rtld-elf/rtld.h
+++ b/libexec/rtld-elf/rtld.h
@@ -262,6 +262,7 @@ typedef struct Struct_Obj_Entry {
bool on_fini_list: 1; /* Object is already on fini list. */
bool dag_inited : 1; /* Object has its DAG initialized. */
bool filtees_loaded : 1; /* Filtees loaded */
+ bool filtees_loading : 1; /* In process of filtees loading */
bool irelative : 1; /* Object has R_MACHDEP_IRELATIVE relocs */
bool irelative_nonplt : 1; /* Object has R_MACHDEP_IRELATIVE non-plt relocs */
bool gnu_ifunc : 1; /* Object has references to STT_GNU_IFUNC */