From 8d0c6336778fed316a174fd278c78a88f7dd6975 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 4 Apr 2025 16:56:44 +0200 Subject: [PATCH] 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. --- src/tools.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/tools.c b/src/tools.c index 2e4858854..b0b066a1d 100644 --- a/src/tools.c +++ b/src/tools.c @@ -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, '/'); -- 2.47.2