diff options
| author | Lars Ingebrigtsen | 2019-10-14 02:52:25 +0200 |
|---|---|---|
| committer | Lars Ingebrigtsen | 2019-10-14 02:52:25 +0200 |
| commit | d1963b312d021e277c12005a2b130c292623e5e7 (patch) | |
| tree | 8b8edc1c71fdd3df141e7d3f053a2a1c4bd116c6 /src | |
| parent | ea7610f1f1e0022647000502a5dfcba8707c4964 (diff) | |
| download | emacs-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.c | 9 |
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 | ||
| 977 | static void | 977 | static void |
| 978 | copy_keymap_set_char_table (Lisp_Object chartable, Lisp_Object idx, | 978 | copy_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 | ||
| 984 | static Lisp_Object | 986 | static 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 | { |