MINOR: tools: also protect the library name resolution against concurrent accesses
authorWilly Tarreau <w@1wt.eu>
Fri, 4 Apr 2025 14:56:44 +0000 (16:56 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 22 Apr 2025 09:41:23 +0000 (11:41 +0200)
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.

(cherry picked from commit 8d0c6336778fed316a174fd278c78a88f7dd6975)
Signed-off-by: Willy Tarreau <w@1wt.eu>
(cherry picked from commit 86d6b398d481d0d60bed9e509659e6722ce66b15)
Signed-off-by: Willy Tarreau <w@1wt.eu>

src/tools.c

index c0a0cb6..806f8e1 100644 (file)
@@ -5503,11 +5503,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 '/'
@@ -5529,6 +5530,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, '/');