emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] master d1963b3: Further changes to ensure that copy-keymap


From: Lars Ingebrigtsen
Subject: [Emacs-diffs] master d1963b3: Further changes to ensure that copy-keymap doesn't segfault
Date: Sun, 13 Oct 2019 20:54:23 -0400 (EDT)

branch: master
commit d1963b312d021e277c12005a2b130c292623e5e7
Author: Lars Ingebrigtsen <address@hidden>
Commit: Lars Ingebrigtsen <address@hidden>

    Further changes to ensure that copy-keymap doesn't segfault
    
    * src/keymap.c (copy_keymap_1, copy_keymap_set_char_table): Ensure
    we don't recurse infinitely when using non-sparse keymaps, too.
    
    This change makes this form not segfault:
    
    (let ((map (make-keymap)))
      (define-key map " " map)
      (copy-keymap map))
---
 src/keymap.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/keymap.c b/src/keymap.c
index 5aed412..0b7de3e 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -975,10 +975,12 @@ copy_keymap_item (Lisp_Object elt, int depth)
 }
 
 static void
-copy_keymap_set_char_table (Lisp_Object chartable, Lisp_Object idx,
+copy_keymap_set_char_table (Lisp_Object chartable_and_depth, Lisp_Object idx,
                            Lisp_Object elt)
 {
-  Fset_char_table_range (chartable, idx, copy_keymap_item (elt, 0));
+  Fset_char_table_range
+    (XCAR (chartable_and_depth), idx,
+     copy_keymap_item (elt, XFIXNUM (XCDR (chartable_and_depth))));
 }
 
 static Lisp_Object
@@ -999,7 +1001,8 @@ copy_keymap_1 (Lisp_Object keymap, int depth)
       if (CHAR_TABLE_P (elt))
        {
          elt = Fcopy_sequence (elt);
-         map_char_table (copy_keymap_set_char_table, Qnil, elt, elt);
+         map_char_table (copy_keymap_set_char_table, Qnil, elt,
+                         Fcons (elt, make_fixnum (depth + 1)));
        }
       else if (VECTORP (elt))
        {



reply via email to

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