]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix reader memory leak upon error (bug#56623)
authorMattias Engdegård <mattiase@acm.org>
Mon, 29 Aug 2022 15:44:31 +0000 (17:44 +0200)
committerMattias Engdegård <mattiase@acm.org>
Mon, 29 Aug 2022 15:48:47 +0000 (17:48 +0200)
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.

src/lread.c

index ccccd79cd7c09d884a792e3369ad07f983fd70b7..15bbf46f78f7e6d3c282c323764dc0d13f7f5b30 100644 (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;