From ebfbe4d26031bde4e91ba489102d60fe6959173f Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Sun, 28 Apr 2024 06:38:32 -0400 Subject: Clear unused `global_error_collector.curr_error` This should cleanly prevent acknowledging duplicate errors on the same position as seems to be the intent based on the prior `else if` condition. --- src/error.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/error.cpp') diff --git a/src/error.cpp b/src/error.cpp index 7fb62c966..bbbb98053 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -403,6 +403,8 @@ gb_internal void error_va(TokenPos const &pos, TokenPos end, char const *fmt, va error_out("\n"); show_error_on_line(pos, end); } else { + global_error_collector.curr_error_value = {}; + global_error_collector.curr_error_value_set.store(false); global_error_collector.count.fetch_sub(1); } try_pop_error_value(); -- cgit v1.2.3 From f1c13d6bd8ad7390ba29d5d6de79596b9b53bf24 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Sun, 28 Apr 2024 14:03:11 -0400 Subject: Fix race condition in `error_va` If the error count exceeded `MAX_ERROR_COLLECTOR_COUNT`, multiple threads could print and exit simultaneously, causing a segfault. This change moves the mutex lock back before the conditional. --- src/error.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/error.cpp') diff --git a/src/error.cpp b/src/error.cpp index bbbb98053..1b091f88e 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -376,11 +376,11 @@ gb_internal void error_out_coloured(char const *str, TerminalStyle style, Termin gb_internal void error_va(TokenPos const &pos, TokenPos end, char const *fmt, va_list va) { global_error_collector.count.fetch_add(1); + mutex_lock(&global_error_collector.mutex); if (global_error_collector.count > MAX_ERROR_COLLECTOR_COUNT()) { print_all_errors(); gb_exit(1); } - mutex_lock(&global_error_collector.mutex); push_error_value(pos, ErrorValue_Error); // NOTE(bill): Duplicate error, skip it -- cgit v1.2.3