From 773c186914627c6be4ab13fcfa62928675ee94e1 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Wed, 15 Sep 2021 16:14:30 +0300 Subject: [PATCH] Avoid crashes due to clearing of a frame's face cache * src/xfaces.c (clear_face_cache): Don't clear fonts and faces of a frame that is being redisplayed, just because it's time for some routine maintenance. (Bug#50571) * src/xdisp.c (redisplay_internal): * src/frame.h (struct frame) : Update commentary of using this struct member. --- src/frame.h | 4 ++-- src/xdisp.c | 13 +++++++------ src/xfaces.c | 3 ++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/frame.h b/src/frame.h index a8ad011889d..3dd76805dd2 100644 --- a/src/frame.h +++ b/src/frame.h @@ -449,8 +449,8 @@ struct frame /* Non-zero if this frame's faces need to be recomputed. */ bool_bf face_change : 1; - /* Non-zero if this frame's image cache cannot be freed because the - frame is in the process of being redisplayed. */ + /* Non-zero if this frame's image cache and face cache cannot be + freed because the frame is in the process of being redisplayed. */ bool_bf inhibit_clear_image_cache : 1; /* True when new_width or new_height were set by change_frame_size, diff --git a/src/xdisp.c b/src/xdisp.c index d30a68570f0..2e72f6b5915 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -16061,12 +16061,13 @@ redisplay_internal (void) if (FRAME_VISIBLE_P (f) && !FRAME_OBSCURED_P (f)) { - /* Don't allow freeing images for this frame as long - as the frame's update wasn't completed. This - prevents crashes when some Lisp that runs from - the various hooks or font-lock decides to clear - the frame's image cache, when the images in that - cache are referenced by the desired matrix. */ + /* Don't allow freeing images and faces for this + frame as long as the frame's update wasn't + completed. This prevents crashes when some Lisp + that runs from the various hooks or font-lock + decides to clear the frame's image cache and face + cache, when the images and faces in those caches + are referenced by the desired matrix. */ f->inhibit_clear_image_cache = true; redisplay_windows (FRAME_ROOT_WINDOW (f)); } diff --git a/src/xfaces.c b/src/xfaces.c index 2273fb4fe4d..aefed54ebcb 100644 --- a/src/xfaces.c +++ b/src/xfaces.c @@ -674,7 +674,8 @@ clear_face_cache (bool clear_fonts_p) { struct frame *f = XFRAME (frame); if (FRAME_WINDOW_P (f) - && FRAME_DISPLAY_INFO (f)->n_fonts > CLEAR_FONT_TABLE_NFONTS) + && FRAME_DISPLAY_INFO (f)->n_fonts > CLEAR_FONT_TABLE_NFONTS + && !f->inhibit_clear_image_cache) { clear_font_cache (f); free_all_realized_faces (frame); -- 2.39.2