emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs-26 fdd3dcf: * src/alloc.c (sweep_symbols): Tweak las


From: Stefan Monnier
Subject: [Emacs-diffs] emacs-26 fdd3dcf: * src/alloc.c (sweep_symbols): Tweak last change
Date: Thu, 2 Nov 2017 10:02:23 -0400 (EDT)

branch: emacs-26
commit fdd3dcfa4eb0a4b17bb43f461a6790f68e76da41
Author: Stefan Monnier <address@hidden>
Commit: Stefan Monnier <address@hidden>

    * src/alloc.c (sweep_symbols): Tweak last change
    
    Avoid the double-free without the extra check.  Add an explanatory comment.
---
 src/alloc.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/src/alloc.c b/src/alloc.c
index 11afdfd..3f4ec16 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -7024,10 +7024,16 @@ sweep_symbols (void)
         {
           if (!sym->s.gcmarkbit)
             {
-              if (sym->s.redirect == SYMBOL_LOCALIZED
-                 /* Already freed?  */
-                 && !EQ (sym->s.function, Vdead))
-                xfree (SYMBOL_BLV (&sym->s));
+              if (sym->s.redirect == SYMBOL_LOCALIZED)
+               {
+                  xfree (SYMBOL_BLV (&sym->s));
+                  /* At every GC we sweep all symbol_blocks and rebuild the
+                     symbol_free_list, so those symbols which stayed unused
+                     between the two will be re-swept.
+                     So we have to make sure we don't re-free this blv next
+                     time we sweep this symbol_block (bug#29066).  */
+                  sym->s.redirect == SYMBOL_PLAINVAL;
+                }
               sym->s.next = symbol_free_list;
               symbol_free_list = &sym->s;
               symbol_free_list->function = Vdead;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]