]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix recently-introduced SAFE_FREE bug
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 28 Jun 2018 20:49:48 +0000 (13:49 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 28 Jun 2018 20:51:09 +0000 (13:51 -0700)
Problem reported by Andy Moreton (Bug#31996).
* src/lisp.h (union specbinding.unwind_array):
Remove unused member func.  Move array after nelts, as this is
likely to generate more efficient code in safe_free, which can
call xfree with the same value either way.
(safe_free): Also handle SPECPDL_UNWIND_AWAY.

src/lisp.h

index b544d814d99cf5eef0b06d66bad4c36915fb4394..cf7b8c0ebc5ea1b2e31a4bebac7ea2336e370c6e 100644 (file)
@@ -3058,9 +3058,8 @@ union specbinding
     } unwind;
     struct {
       ENUM_BF (specbind_tag) kind : CHAR_BIT;
-      void (*func) (Lisp_Object);
-      Lisp_Object *array;
       ptrdiff_t nelts;
+      Lisp_Object *array;
     } unwind_array;
     struct {
       ENUM_BF (specbind_tag) kind : CHAR_BIT;
@@ -4543,9 +4542,16 @@ safe_free (ptrdiff_t sa_count)
   while (specpdl_ptr != specpdl + sa_count)
     {
       specpdl_ptr--;
-      eassert (specpdl_ptr->kind == SPECPDL_UNWIND_PTR
-              && specpdl_ptr->unwind_ptr.func == xfree);
-      xfree (specpdl_ptr->unwind_ptr.arg);
+      if (specpdl_ptr->kind == SPECPDL_UNWIND_PTR)
+       {
+         eassert (specpdl_ptr->unwind_ptr.func == xfree);
+         xfree (specpdl_ptr->unwind_ptr.arg);
+       }
+      else
+       {
+         eassert (specpdl_ptr->kind == SPECPDL_UNWIND_ARRAY);
+         xfree (specpdl_ptr->unwind_array.array);
+       }
     }
 }