diff options
author | Jonathan Kyle Mitchell <kyle@jonathanmitchell.org> | 2018-07-04 22:38:29 -0500 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2018-07-14 14:26:04 +0300 |
commit | 9f25231f354a973d5331b62717ec46e0cbcbbc6e (patch) | |
tree | a1ea5cc15ba45ed58d91f4eeb0138735b830655f | |
parent | 41f5de7c8ac3da19ccc8c96be52a6714a9b49a8f (diff) | |
download | emacs-9f25231f354a973d5331b62717ec46e0cbcbbc6e.tar.gz |
Avoid infloop in redisplay due to faulty mode-line properties
* xdisp.c (safe_set_text_properties): New function.
(display_mode_element): Call Fset_text_properties through
internal_condition_case_n, using safe_set_text_properties as a
wrapper. (Bug#32038)
-rw-r--r-- | src/xdisp.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/xdisp.c b/src/xdisp.c index 9b4febdd61a..1199e1c1b7d 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -23516,6 +23516,17 @@ move_elt_to_front (Lisp_Object elt, Lisp_Object list) return list; } +/* Subroutine to call Fset_text_properties through + internal_condition_case_n. ARGS are the arguments of + Fset_text_properties, in order. */ + +static Lisp_Object +safe_set_text_properties (ptrdiff_t nargs, Lisp_Object *args) +{ + eassert (nargs == 4); + return Fset_text_properties (args[0], args[1], args[2], args[3]); +} + /* Contribute ELT to the mode line for window IT->w. How it translates into text depends on its data type. @@ -23610,8 +23621,17 @@ display_mode_element (struct it *it, int depth, int field_width, int precision, = Fdelq (aelt, mode_line_proptrans_alist); elt = Fcopy_sequence (elt); - Fset_text_properties (make_number (0), Flength (elt), - props, elt); + /* PROPS might cause set-text-properties to signal + an error, so we call it via internal_condition_case_n, + to avoid an infloop in redisplay due to the error. */ + internal_condition_case_n (safe_set_text_properties, + 4, + ((Lisp_Object []) + {make_number (0), + Flength (elt), + props, + elt}), + Qt, safe_eval_handler); /* Add this item to mode_line_proptrans_alist. */ mode_line_proptrans_alist = Fcons (Fcons (elt, props), |