From 58b56b91c454f4e1c04ca1cf58e35809caf979de Mon Sep 17 00:00:00 2001 From: Emilie Feral Date: Mon, 27 Dec 2021 15:39:34 +0100 Subject: [PATCH] py/qstr: Reset mpstate.qstr_last_chunk before raising an error. The qstr_last_chunk is not collected by the garbage collector. This relies on the assertion that qstr_pool_t also references the qstr_last_chunk. If an exception is raised while allocating the qstr_pool_t, qstr_last_chunk has to be invalidated not to become a dangling reference at the next garbage collection. Signed-off-by: Emilie Feral --- py/qstr.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/py/qstr.c b/py/qstr.c index c14ec5ae00..e5b13b700d 100644 --- a/py/qstr.c +++ b/py/qstr.c @@ -153,6 +153,12 @@ STATIC qstr qstr_add(const byte *q_ptr) { #endif qstr_pool_t *pool = m_new_obj_var_maybe(qstr_pool_t, const char *, new_alloc); if (pool == NULL) { + // Keep qstr_last_chunk consistent with qstr_pool_t: qstr_last_chunk is not scanned + // at garbage collection since it's reachable from a qstr_pool_t. And the caller of + // this function expects q_ptr to be stored in a qstr_pool_t so it can be reached + // by the collector. If qstr_pool_t allocation failed, qstr_last_chunk needs to be + // NULL'd. Otherwise it may become a dangling pointer at the next garbage collection. + MP_STATE_VM(qstr_last_chunk) = NULL; QSTR_EXIT(); m_malloc_fail(new_alloc); }