From af16d43af82ad0d05710c42232332a400614d3ea Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Mon, 11 Oct 2021 09:23:39 +0300 Subject: fixed crashes when the Q-Reg stack is non-empty at exit * Test case: sciteco -e '[a' [aEX$$ in interactive mode would also crash. * No longer use a destructor - it was executed after the Q-Reg view was destroyed. * Instead, we now explicitly call teco_qreg_stack_clear() in main(). * Added a regression test case. --- src/main.c | 1 + src/qreg.c | 4 +--- src/qreg.h | 1 + tests/testsuite.at | 4 ++++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main.c b/src/main.c index 38b1197..797ef73 100644 --- a/src/main.c +++ b/src/main.c @@ -457,6 +457,7 @@ cleanup: teco_ring_cleanup(); teco_qreg_table_clear(&local_qregs); teco_qreg_table_clear(&teco_qreg_table_globals); + teco_qreg_stack_clear(); teco_view_free(teco_qreg_view); #endif teco_interface_cleanup(); diff --git a/src/qreg.c b/src/qreg.c index 5c39409..84bc217 100644 --- a/src/qreg.c +++ b/src/qreg.c @@ -1140,14 +1140,12 @@ teco_qreg_stack_pop(teco_qreg_t *qreg, GError **error) return TRUE; } -#ifndef NDEBUG -static void __attribute__((destructor)) +void teco_qreg_stack_clear(void) { g_array_set_clear_func(teco_qreg_stack, (GDestroyNotify)teco_qreg_stack_entry_clear); g_array_free(teco_qreg_stack, TRUE); } -#endif gboolean teco_ed_hook(teco_ed_hook_t type, GError **error) diff --git a/src/qreg.h b/src/qreg.h index 4797a01..6199b31 100644 --- a/src/qreg.h +++ b/src/qreg.h @@ -179,6 +179,7 @@ extern teco_qreg_table_t teco_qreg_table_globals; gboolean teco_qreg_stack_push(teco_qreg_t *qreg, GError **error); gboolean teco_qreg_stack_pop(teco_qreg_t *qreg, GError **error); +void teco_qreg_stack_clear(void); typedef enum { TECO_ED_HOOK_ADD = 1, diff --git a/tests/testsuite.at b/tests/testsuite.at index ab24504..d9bb67d 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -89,6 +89,10 @@ AT_SETUP([Memory limiting during spawning]) AT_CHECK([$SCITECO -e "50*1000*1000,2EJ 0,128ED @EC'dd if=/dev/zero'"], 1, ignore, ignore) AT_CLEANUP +AT_SETUP([Q-Register stack cleanup]) +AT_CHECK([$SCITECO -e '@<:@a'], 0, ignore, ignore) +AT_CLEANUP + AT_BANNER([Known Bugs]) AT_SETUP([Pattern matching overflow]) -- cgit v1.2.3