From 32ccbb213b2a2d419581690d42611c375c3d22cf Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Thu, 30 Sep 2010 12:29:08 -0400 Subject: Fix behaviour when the error handler itself calls dmnsn_error(). --- libdimension/error.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'libdimension/error.c') diff --git a/libdimension/error.c b/libdimension/error.c index 11b4805..721b45c 100644 --- a/libdimension/error.c +++ b/libdimension/error.c @@ -133,14 +133,22 @@ void dmnsn_set_fatal_error_fn(dmnsn_fatal_error_fn *fatal) } } +/* Prevent infinite recursion if the fatal error function itself calls + dmnsn_error() */ +static __thread bool dmnsn_tl_exiting = false; + static void dmnsn_default_fatal_error_fn() { dmnsn_backtrace(stderr); - if (dmnsn_is_main_thread()) { + if (dmnsn_tl_exiting) { + abort(); + } else if (dmnsn_is_main_thread()) { exit(EXIT_FAILURE); } else { + dmnsn_tl_exiting = true; + int *ret = malloc(sizeof(int)); /* Don't use dmnsn_malloc */ if (ret) *ret = 1; -- cgit v1.2.3