mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-10-28 19:34:43 +01:00
rtld: release rtld_bind_lock around calls to .preinit_array initializers
We unlock the bind lock around .init calls anyway. Also, the main object cannot be unloaded. Reported and reviewed by: dim PR: 298943 Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D60588
This commit is contained in:
1 parent
f877ace816
commit
ef758b59a4
1 file changed
+5
-3
@@ -187,7 +187,7 @@ static char *origin_subst_one(Obj_Entry *, char *, const char *, const char *,
|
||||
bool);
|
||||
static char *origin_subst(Obj_Entry *, const char *);
|
||||
static bool obj_resolve_origin(Obj_Entry *obj);
|
||||
static void preinit_main(void);
|
||||
static void preinit_main(RtldLockState *lockstate);
|
||||
static void rtld_recalc_bind_not(const char *);
|
||||
static void rtld_recalc_dangerous_ld_env(void);
|
||||
static void rtld_recalc_debug(const char *);
|
||||
@@ -1005,7 +1005,7 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
|
||||
|
||||
rtld_exit_ptr = rtld_exit;
|
||||
if (obj_main->crt_no_init)
|
||||
preinit_main();
|
||||
preinit_main(&lockstate);
|
||||
objlist_call_init(&initlist, &lockstate);
|
||||
_r_debug_postinit(&obj_main->linkmap);
|
||||
objlist_clear(&initlist);
|
||||
@@ -3122,7 +3122,7 @@ obj_from_addr(const void *addr)
|
||||
}
|
||||
|
||||
static void
|
||||
preinit_main(void)
|
||||
preinit_main(RtldLockState *lockstate)
|
||||
{
|
||||
uintptr_t *preinit_addr;
|
||||
int index;
|
||||
@@ -3131,6 +3131,7 @@ preinit_main(void)
|
||||
if (preinit_addr == NULL)
|
||||
return;
|
||||
|
||||
lock_release(rtld_bind_lock, lockstate);
|
||||
for (index = 0; index < obj_main->preinit_array_num; index++) {
|
||||
if (preinit_addr[index] != 0 && preinit_addr[index] != 1) {
|
||||
dbg("calling preinit function for %s at %p",
|
||||
@@ -3140,6 +3141,7 @@ preinit_main(void)
|
||||
call_init_pointer(obj_main, preinit_addr[index]);
|
||||
}
|
||||
}
|
||||
wlock_acquire(rtld_bind_lock, lockstate);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in new issue
Block a user