3aae792b10
As reported in #2449, under certain circumstances it's possible to get stuck in an infinite loop attempting to purge from the HPA. We now handle this by validating the HPA settings at the end of configuration parsing and either normalizing them or aborting depending on if `abort_conf` is set.
57 lines
1.8 KiB
C
57 lines
1.8 KiB
C
#include "test/jemalloc_test.h"
|
|
|
|
static bool abort_called = false;
|
|
static void (*default_malloc_message)(void *, const char *);
|
|
|
|
static void
|
|
mock_invalid_conf_abort(void) {
|
|
abort_called = true;
|
|
}
|
|
|
|
static void
|
|
null_malloc_message(void *_1, const char* _2) {
|
|
}
|
|
|
|
TEST_BEGIN(test_hpa_validate_conf) {
|
|
test_skip_if(!hpa_supported());
|
|
void *ptr = malloc(4096);
|
|
/* Need to restore this here to see any possible assert messages */
|
|
malloc_message = default_malloc_message;
|
|
assert_true(abort_called,
|
|
"Should have aborted due to invalid values for hpa_dirty_mult and "
|
|
"hpa_hugification_threshold_ratio");
|
|
free(ptr);
|
|
}
|
|
TEST_END
|
|
|
|
/*
|
|
* We have to set `abort_conf:true` here and not via the `MALLOC_CONF`
|
|
* environment variable in the associated shell script for this test. This is
|
|
* because when testing on FreeBSD (where Jemalloc is the system allocator) in
|
|
* CI configs where HPA is not supported, setting `abort_conf:true` there would
|
|
* result in the system Jemalloc picking this up and aborting before we could
|
|
* ever even launch the test.
|
|
*/
|
|
const char *malloc_conf = "abort_conf:true";
|
|
|
|
int
|
|
main(void) {
|
|
/*
|
|
* OK, this is a sort of nasty hack. We don't want to add *another*
|
|
* config option for HPA (the intent is that it becomes available on
|
|
* more platforms over time, and we're trying to prune back config
|
|
* options generally. But we'll get initialization errors on other
|
|
* platforms if we set hpa:true in the MALLOC_CONF (even if we set
|
|
* abort_conf:false as well). So we reach into the internals and set
|
|
* them directly, but only if we know that we're actually going to do
|
|
* something nontrivial in the tests.
|
|
*/
|
|
if (hpa_supported()) {
|
|
default_malloc_message = malloc_message;
|
|
malloc_message = null_malloc_message;
|
|
opt_hpa = true;
|
|
invalid_conf_abort = mock_invalid_conf_abort;
|
|
}
|
|
return test_no_reentrancy(test_hpa_validate_conf);
|
|
}
|