Commit 58b56b91 authored by Emilie Feral's avatar Emilie Feral Committed by Damien George

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: default avatarEmilie Feral <emilie.feral@numworks.com>
parent 01953f29
......@@ -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);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment