summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Kyle Mitchell <kyle@jonathanmitchell.org>2018-07-04 22:38:29 -0500
committerEli Zaretskii <eliz@gnu.org>2018-07-14 14:26:04 +0300
commit9f25231f354a973d5331b62717ec46e0cbcbbc6e (patch)
treea1ea5cc15ba45ed58d91f4eeb0138735b830655f
parent41f5de7c8ac3da19ccc8c96be52a6714a9b49a8f (diff)
downloademacs-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.c24
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),