From b7b98405089e69dfae0fc11e2a423860f50756e9 Mon Sep 17 00:00:00 2001 From: Robin Haberkorn Date: Wed, 18 Sep 2024 12:32:16 +0200 Subject: check that local register is not edited at the end of macro calls * This was unsafe and could easily result in crashes, since teco_qreg_current would afterwards point to an already freed Q-Register. * Since automatically editing another register or buffer is not easy to do right, we throw an error instead. --- src/error.h | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/error.h') diff --git a/src/error.h b/src/error.h index b12ec80..03af66c 100644 --- a/src/error.h +++ b/src/error.h @@ -47,6 +47,7 @@ typedef enum { TECO_ERROR_INVALIDQREG, TECO_ERROR_QREGOPUNSUPPORTED, TECO_ERROR_QREGCONTAINSNULL, + TECO_ERROR_EDITINGLOCALQREG, TECO_ERROR_MEMLIMIT, /** Interrupt current operation */ @@ -126,6 +127,14 @@ teco_error_qregcontainsnull_set(GError **error, const gchar *name, gsize len, gb "%sQ-Register \"%s\" contains null-byte", local ? "Local " : "", name_printable); } +static inline void +teco_error_editinglocalqreg_set(GError **error, const gchar *name, gsize len) +{ + g_autofree gchar *name_printable = teco_string_echo(name, len); + g_set_error(error, TECO_ERROR, TECO_ERROR_EDITINGLOCALQREG, + "Editing local Q-Register \"%s\" at end of macro call", name_printable); +} + static inline void teco_error_interrupted_set(GError **error) { -- cgit v1.2.3