From 8f532a9ee3a39d5792593c1b8b39a50710651786 Mon Sep 17 00:00:00 2001 From: Daniel Colascione Date: Mon, 17 Oct 2016 14:48:35 -0700 Subject: [PATCH] Fix write beyond end of stack when an error converter goes unused --- util.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/util.c b/util.c index d19b907..0eb291c 100644 --- a/util.c +++ b/util.c @@ -329,6 +329,17 @@ check_deferred_errors(void) } } +static void +delist_error_converters(void) +{ + while (!LIST_EMPTY(¤t_errh->error_converters)) { + struct error_converter_record* ecr = + LIST_FIRST(¤t_errh->error_converters); + LIST_REMOVE(ecr, link); + ecr->onlist = false; + } +} + bool catch_error(void (*fn)(void* fndata), void* fndata, @@ -345,8 +356,11 @@ catch_error(void (*fn)(void* fndata), current_errh = &errh; if (sigsetjmp(errh.where, 1) == 0) { fn(fndata); + // Not reached on success: on error, we jump to the + // __sync_synchronize below. check_deferred_errors(); reslist_xfer(rl->parent, rl); + delist_error_converters(); error = false; } else { __sync_synchronize();