]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: activity/memprofile: always return "other" bin on NULL return address
authorWilly Tarreau <w@1wt.eu>
Tue, 15 Oct 2024 06:09:09 +0000 (08:09 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 15 Oct 2024 06:12:34 +0000 (08:12 +0200)
It was found in a large "show profiling memory" output that a few entries
have a NULL return address, which causes confusion because this address
will be reused by the next new allocation caller, possibly resulting in
inconsistencies such as "free() ... pool=trash" which makes no sense. The
cause is in fact that the first caller had an entry->info pointing to the
trash pool from a p_alloc/p_free with a NULL return address, and the second
had a different type and reused that entry.

Let's make sure undecodable stacks causing an apparent NULL return address
all lead to the "other" bin.

While this is not exactly a bug, it would make sense to backport it to the
recent branches where the feature is used (probably at least as far as 2.8).

src/activity.c

index 5417deb6224063b4e2546729c3b730e2ea8d6c6c..c38deed085adebd307daffdd0b1fb8011e42898c 100644 (file)
@@ -185,6 +185,10 @@ struct memprof_stats *memprof_get_bin(const void *ra, enum memprof_method meth)
        const void *old;
        unsigned int bin;
 
+       if (unlikely(!ra)) {
+               bin = MEMPROF_HASH_BUCKETS;
+               goto leave;
+       }
        bin = ptr_hash(ra, MEMPROF_HASH_BITS);
        for (; memprof_stats[bin].caller != ra; bin = (bin + 1) & (MEMPROF_HASH_BUCKETS - 1)) {
                if (!--retries) {
@@ -199,6 +203,7 @@ struct memprof_stats *memprof_get_bin(const void *ra, enum memprof_method meth)
                        break;
                }
        }
+leave:
        return &memprof_stats[bin];
 }