From: Willy Tarreau Date: Fri, 4 Apr 2025 14:56:44 +0000 (+0200) Subject: MINOR: tools: also protect the library name resolution against concurrent accesses X-Git-Tag: v3.2-dev11~23 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8d0c6336778fed316a174fd278c78a88f7dd6975;p=thirdparty%2Fhaproxy.git 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. --- 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, '/');