• Colin Hogben's avatar
    py: Fix wrong assumption that m_renew will not move if shrinking · f9b6b37c
    Colin Hogben authored
    In both parse.c and qstr.c, an internal chunking allocator tidies up
    by calling m_renew to shrink an allocated chunk to the size used, and
    assumes that the chunk will not move.  However, when MICROPY_ENABLE_GC
    is false, m_renew calls the system realloc, which does not guarantee
    this behaviour.  Environments where realloc may return a different
    pointer include:
    
    (1) mbed-os with MBED_HEAP_STATS_ENABLED (which adds a wrapper around
    malloc & friends; this is where I was hit by the bug);
    
    (2) valgrind on linux (how I diagnosed it).
    
    The fix is to call m_renew_maybe with allow_move=false.
    f9b6b37c
parse.c 42.3 KB