]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[MEDIUM] ensure we don't recursively call pool_gc2()
authorWilly Tarreau <w@1wt.eu>
Tue, 21 Apr 2009 00:17:45 +0000 (02:17 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 21 Apr 2009 00:17:45 +0000 (02:17 +0200)
A race condition exists in the hot reconfiguration code. It is
theorically possible that the second signal is sent during a free()
in the first list, which can cause crashes or freezes (the later
have been observed). Just set up a counter to ensure we do not
recurse.

src/memory.c

index 05178e58ca11ea14a068f08dcf19fa76460420e7..36db92e34eedd8a9ff2b9819f3e35d2458c787dd 100644 (file)
@@ -122,11 +122,17 @@ void pool_flush2(struct pool_head *pool)
 
 /*
  * This function frees whatever can be freed in all pools, but respecting
- * the minimum thresholds imposed by owners.
+ * the minimum thresholds imposed by owners. It takes care of avoiding
+ * recursion because it may be called from a signal handler.
  */
 void pool_gc2()
 {
+       static int recurse;
        struct pool_head *entry;
+
+       if (recurse++)
+               goto out;
+
        list_for_each_entry(entry, &pools, list) {
                void *temp, *next;
                //qfprintf(stderr, "Flushing pool %s\n", entry->name);
@@ -141,6 +147,8 @@ void pool_gc2()
                }
                entry->free_list = next;
        }
+ out:
+       recurse--;
 }
 
 /*