MINOR: tools: also protect the library name resolution against concurrent accesses

This is an extension of eb41d768f ("MINOR: tools: use only opportunistic
symbols resolution"). It also makes sure we're not calling dladddr() in
parallel to dladdr_and_size(), as a preventive measure against some
potential deadlocks in the inner layers of the libc.
This commit is contained in:
Willy Tarreau 2025-04-04 16:56:44 +02:00
parent 5b5960359f
commit 8d0c633677

View File

@ -5611,11 +5611,12 @@ const void *resolve_sym_name(struct buffer *buf, const char *pfx, const void *ad
goto use_array;
i = dladdr_and_size(addr, &dli, &size);
if (!isolated)
HA_SPIN_UNLOCK(OTHER_LOCK, &dladdr_lock);
if (!i)
if (!i) {
if (!isolated)
HA_SPIN_UNLOCK(OTHER_LOCK, &dladdr_lock);
goto use_array;
}
/* 1. prefix the library name if it's not the same object as the one
* that contains the main function. The name is picked between last '/'
@ -5637,6 +5638,9 @@ const void *resolve_sym_name(struct buffer *buf, const char *pfx, const void *ad
ha_thread_relax();
}
if (!isolated)
HA_SPIN_UNLOCK(OTHER_LOCK, &dladdr_lock);
if (dli_main.dli_fbase != dli.dli_fbase) {
fname = dli.dli_fname;
p = strrchr(fname, '/');