]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid infloop in redisplay due to faulty mode-line properties
authorJonathan Kyle Mitchell <kyle@jonathanmitchell.org>
Thu, 5 Jul 2018 03:38:29 +0000 (22:38 -0500)
committerEli Zaretskii <eliz@gnu.org>
Sat, 14 Jul 2018 11:26:04 +0000 (14:26 +0300)
* 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)

src/xdisp.c

index 9b4febdd61a5c6efbb7b3d4a263d4d7cd23d8e16..1199e1c1b7d16f4236be12c76ed27b0d479dfb06 100644 (file)
@@ -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),