Hello all,
here is a patch that does not allow the use of malloc_trim() function if
HAProxy is linked with the malloc library. It was checked in some places in
the source, but not everywhere.
Also, in that case, when calling 'haproxy -vv', it is no longer printed that
malloc_trim is enabled.
--
Miroslav Zagorac
Senior Developer
From 33a84d19548baf46e8fccbb58a891a3e4c6b4895 Mon Sep 17 00:00:00 2001
From: Miroslav Zagorac <mzago...@haproxy.com>
Date: Wed, 22 Mar 2023 12:52:19 +0100
Subject: [PATCH] BUG/MINOR: illegal use of the malloc_trim() function if
jemalloc is used
In the event that HAProxy is linked with the jemalloc library, it is still
shown that malloc_trim() is enabled when executing "haproxy -vv":
..
Support for malloc_trim() is enabled.
..
It's not so much a problem as it is that malloc_trim() is called in the
pat_ref_purge_range() function without any checking.
This was solved by setting the using_default_allocator variable to the
correct value in the detect_allocator() function and before calling
malloc_trim() it is checked whether the function should be called.
---
include/haproxy/pool.h | 1 +
src/pattern.c | 2 +-
src/pool.c | 9 ++++-----
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/include/haproxy/pool.h b/include/haproxy/pool.h
index 16146604b..a12990d24 100644
--- a/include/haproxy/pool.h
+++ b/include/haproxy/pool.h
@@ -101,6 +101,7 @@ extern int mem_poison_byte;
/* set of POOL_DBG_* flags */
extern uint pool_debugging;
+int is_trim_enabled(void);
void *pool_get_from_os(struct pool_head *pool);
void pool_put_to_os(struct pool_head *pool, void *ptr);
void *pool_alloc_nocache(struct pool_head *pool);
diff --git a/src/pattern.c b/src/pattern.c
index a2557dea1..71f25a43b 100644
--- a/src/pattern.c
+++ b/src/pattern.c
@@ -2084,7 +2084,7 @@ int pat_ref_purge_range(struct pat_ref *ref, uint from, uint to, int budget)
HA_RWLOCK_WRUNLOCK(PATEXP_LOCK, &expr->lock);
#if defined(HA_HAVE_MALLOC_TRIM)
- if (done) {
+ if (done && is_trim_enabled()) {
malloc_trim(0);
}
#endif
diff --git a/src/pool.c b/src/pool.c
index 345681a0c..214d950fb 100644
--- a/src/pool.c
+++ b/src/pool.c
@@ -177,11 +177,10 @@ static void detect_allocator(void)
my_mallctl = mallctl;
#endif
-
- if (!my_mallctl) {
+ if (!my_mallctl)
my_mallctl = get_sym_curr_addr("mallctl");
- using_default_allocator = (my_mallctl == NULL);
- }
+
+ using_default_allocator = (my_mallctl == NULL);
if (!my_mallctl) {
#if defined(HA_HAVE_MALLOC_TRIM)
@@ -212,7 +211,7 @@ static void detect_allocator(void)
}
}
-static int is_trim_enabled(void)
+int is_trim_enabled(void)
{
return using_default_allocator;
}
--
2.37.1