Add double free detection in thread cache for debug build
Add new runtime option `debug_double_free_max_scan` that specifies the max number of stack entries to scan in the cache bit when trying to detect the double free bug (currently debug build only).
This commit is contained in:
@@ -92,6 +92,7 @@ CTL_PROTO(config_xmalloc)
|
||||
CTL_PROTO(opt_abort)
|
||||
CTL_PROTO(opt_abort_conf)
|
||||
CTL_PROTO(opt_cache_oblivious)
|
||||
CTL_PROTO(opt_debug_double_free_max_scan)
|
||||
CTL_PROTO(opt_trust_madvise)
|
||||
CTL_PROTO(opt_confirm_conf)
|
||||
CTL_PROTO(opt_hpa)
|
||||
@@ -479,7 +480,9 @@ static const ctl_named_node_t opt_node[] = {
|
||||
{NAME("prof_sys_thread_name"), CTL(opt_prof_sys_thread_name)},
|
||||
{NAME("prof_time_resolution"), CTL(opt_prof_time_res)},
|
||||
{NAME("lg_san_uaf_align"), CTL(opt_lg_san_uaf_align)},
|
||||
{NAME("zero_realloc"), CTL(opt_zero_realloc)}
|
||||
{NAME("zero_realloc"), CTL(opt_zero_realloc)},
|
||||
{NAME("debug_double_free_max_scan"),
|
||||
CTL(opt_debug_double_free_max_scan)}
|
||||
};
|
||||
|
||||
static const ctl_named_node_t tcache_node[] = {
|
||||
@@ -2128,6 +2131,8 @@ CTL_RO_CONFIG_GEN(config_xmalloc, bool)
|
||||
CTL_RO_NL_GEN(opt_abort, opt_abort, bool)
|
||||
CTL_RO_NL_GEN(opt_abort_conf, opt_abort_conf, bool)
|
||||
CTL_RO_NL_GEN(opt_cache_oblivious, opt_cache_oblivious, bool)
|
||||
CTL_RO_NL_GEN(opt_debug_double_free_max_scan,
|
||||
opt_debug_double_free_max_scan, unsigned)
|
||||
CTL_RO_NL_GEN(opt_trust_madvise, opt_trust_madvise, bool)
|
||||
CTL_RO_NL_GEN(opt_confirm_conf, opt_confirm_conf, bool)
|
||||
|
||||
|
@@ -154,6 +154,9 @@ fxp_t opt_narenas_ratio = FXP_INIT_INT(4);
|
||||
|
||||
unsigned ncpus;
|
||||
|
||||
unsigned opt_debug_double_free_max_scan =
|
||||
SAFETY_CHECK_DOUBLE_FREE_MAX_SCAN_DEFAULT;
|
||||
|
||||
/* Protects arenas initialization. */
|
||||
malloc_mutex_t arenas_lock;
|
||||
|
||||
@@ -1420,6 +1423,10 @@ malloc_conf_init_helper(sc_data_t *sc_data, unsigned bin_shard_sizes[SC_NBINS],
|
||||
CONF_HANDLE_UNSIGNED(opt_lg_tcache_flush_large_div,
|
||||
"lg_tcache_flush_large_div", 1, 16,
|
||||
CONF_CHECK_MIN, CONF_CHECK_MAX, /* clip */ true)
|
||||
CONF_HANDLE_UNSIGNED(opt_debug_double_free_max_scan,
|
||||
"debug_double_free_max_scan", 0, UINT_MAX,
|
||||
CONF_DONT_CHECK_MIN, CONF_DONT_CHECK_MAX,
|
||||
/* clip */ false)
|
||||
|
||||
/*
|
||||
* The runtime option of oversize_threshold remains
|
||||
@@ -1737,6 +1744,10 @@ malloc_conf_init_check_deps(void) {
|
||||
"prof_final.\n");
|
||||
return true;
|
||||
}
|
||||
/* To emphasize in the stats output that opt is disabled when !debug. */
|
||||
if (!config_debug) {
|
||||
opt_debug_double_free_max_scan = 0;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
@@ -1518,6 +1518,7 @@ stats_general_print(emitter_t *emitter) {
|
||||
OPT_WRITE_SIZE_T("tcache_gc_delay_bytes")
|
||||
OPT_WRITE_UNSIGNED("lg_tcache_flush_small_div")
|
||||
OPT_WRITE_UNSIGNED("lg_tcache_flush_large_div")
|
||||
OPT_WRITE_UNSIGNED("debug_double_free_max_scan")
|
||||
OPT_WRITE_CHAR_P("thp")
|
||||
OPT_WRITE_BOOL("prof")
|
||||
OPT_WRITE_CHAR_P("prof_prefix")
|
||||
|
Reference in New Issue
Block a user