From 1751db140ab609e38af8218efbd23427115a42aa Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 22 Mar 2023 18:01:41 +0100 Subject: [PATCH] MINOR: pools: report a replaced memory allocator instead of just malloc_trim() Instead of reporting the inaccurate "malloc_trim() support" on -vv, let's report the case where the memory allocator was actively replaced from the one used at build time, as this is the corner case we want to be cautious about. We also put a tainted bit when this happens so that it's possible to detect it at run time (e.g. the user might have inherited it from an environment variable during a reload operation). The now unused is_trim_enabled() function was finally dropped. --- include/haproxy/bug.h | 1 + include/haproxy/pool.h | 1 - src/pool.c | 10 +++------- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/include/haproxy/bug.h b/include/haproxy/bug.h index 54536ff860..a5c1341968 100644 --- a/include/haproxy/bug.h +++ b/include/haproxy/bug.h @@ -221,6 +221,7 @@ enum tainted_flags { TAINTED_BUG = 0x00000020, /* a BUG_ON triggered */ TAINTED_SHARED_LIBS = 0x00000040, /* a shared library was loaded */ TAINTED_REDEFINITION = 0x00000080, /* symbol redefinition detected */ + TAINTED_REPLACED_MEM_ALLOCATOR = 0x00000100, /* memory allocator was replaced using LD_PRELOAD */ }; /* this is a bit field made of TAINTED_*, and is declared in haproxy.c */ diff --git a/include/haproxy/pool.h b/include/haproxy/pool.h index d034feaff5..19ead23798 100644 --- a/include/haproxy/pool.h +++ b/include/haproxy/pool.h @@ -101,7 +101,6 @@ extern int mem_poison_byte; /* set of POOL_DBG_* flags */ extern uint pool_debugging; -int is_trim_enabled(void); int malloc_trim(size_t pad); void trim_all_pools(void); diff --git a/src/pool.c b/src/pool.c index 07b122a61a..292b27d133 100644 --- a/src/pool.c +++ b/src/pool.c @@ -188,11 +188,6 @@ static void detect_allocator(void) _malloc_trim = get_sym_next_addr("malloc_trim"); } -int is_trim_enabled(void) -{ - return !disable_trim && using_default_allocator; -} - /* replace the libc's malloc_trim() so that we can also intercept the calls * from child libraries when the allocator is not the default one. */ @@ -1221,10 +1216,11 @@ INITCALL0(STG_PREPARE, init_pools); /* Report in build options if trim is supported */ static void pools_register_build_options(void) { - if (is_trim_enabled() && _malloc_trim) { + if (!using_default_allocator) { char *ptr = NULL; - memprintf(&ptr, "Support for malloc_trim() is enabled."); + memprintf(&ptr, "Running with a replaced memory allocator (e.g. via LD_PRELOAD)."); hap_register_build_opts(ptr, 1); + mark_tainted(TAINTED_REPLACED_MEM_ALLOCATOR); } } INITCALL0(STG_REGISTER, pools_register_build_options);