Fix reader memory leak upon error (bug#56623)

Reported by Tom Gillespie; error found by Greg Hendershott.

* src/lread.c (read_stack_reset): New.
(read0): Reset read stack when unwinding from an error.
This commit is contained in:
Mattias Engdegård 2022-08-29 17:44:31 +02:00
parent df62a3f85a
commit c0bb1aac10

View file

@ -3686,6 +3686,12 @@ read_stack_push (struct read_stack_entry e)
rdstack.stack[rdstack.sp++] = e;
}
static void
read_stack_reset (intmax_t sp)
{
eassert (sp <= rdstack.sp);
rdstack.sp = sp;
}
/* Read a Lisp object.
If LOCATE_SYMS is true, symbols are read with position. */
@ -3699,6 +3705,7 @@ read0 (Lisp_Object readcharfun, bool locate_syms)
specpdl_ref count = SPECPDL_INDEX ();
ptrdiff_t base_sp = rdstack.sp;
record_unwind_protect_intmax (read_stack_reset, base_sp);
bool uninterned_symbol;
bool skip_shorthand;