aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Ingebrigtsen2019-10-14 02:52:25 +0200
committerLars Ingebrigtsen2019-10-14 02:52:25 +0200
commitd1963b312d021e277c12005a2b130c292623e5e7 (patch)
tree8b8edc1c71fdd3df141e7d3f053a2a1c4bd116c6 /src
parentea7610f1f1e0022647000502a5dfcba8707c4964 (diff)
downloademacs-d1963b312d021e277c12005a2b130c292623e5e7.tar.gz
emacs-d1963b312d021e277c12005a2b130c292623e5e7.zip
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))
Diffstat (limited to 'src')
-rw-r--r--src/keymap.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/keymap.c b/src/keymap.c
index 5aed4129bb7..0b7de3e9cc5 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -975,10 +975,12 @@ copy_keymap_item (Lisp_Object elt, int depth)
975} 975}
976 976
977static void 977static void
978copy_keymap_set_char_table (Lisp_Object chartable, Lisp_Object idx, 978copy_keymap_set_char_table (Lisp_Object chartable_and_depth, Lisp_Object idx,
979 Lisp_Object elt) 979 Lisp_Object elt)
980{ 980{
981 Fset_char_table_range (chartable, idx, copy_keymap_item (elt, 0)); 981 Fset_char_table_range
982 (XCAR (chartable_and_depth), idx,
983 copy_keymap_item (elt, XFIXNUM (XCDR (chartable_and_depth))));
982} 984}
983 985
984static Lisp_Object 986static Lisp_Object
@@ -999,7 +1001,8 @@ copy_keymap_1 (Lisp_Object keymap, int depth)
999 if (CHAR_TABLE_P (elt)) 1001 if (CHAR_TABLE_P (elt))
1000 { 1002 {
1001 elt = Fcopy_sequence (elt); 1003 elt = Fcopy_sequence (elt);
1002 map_char_table (copy_keymap_set_char_table, Qnil, elt, elt); 1004 map_char_table (copy_keymap_set_char_table, Qnil, elt,
1005 Fcons (elt, make_fixnum (depth + 1)));
1003 } 1006 }
1004 else if (VECTORP (elt)) 1007 else if (VECTORP (elt))
1005 { 1008 {