emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

emacs-30 13f69f254cf: Fix rare segfaults due to freed fontsets


From: Eli Zaretskii
Subject: emacs-30 13f69f254cf: Fix rare segfaults due to freed fontsets
Date: Thu, 29 Aug 2024 05:57:19 -0400 (EDT)

branch: emacs-30
commit 13f69f254cfacfcc780b49c34e044b39dc333732
Author: Eli Zaretskii <eliz@gnu.org>
Commit: Eli Zaretskii <eliz@gnu.org>

    Fix rare segfaults due to freed fontsets
    
    * src/xfaces.c (recompute_basic_faces): Force complete
    recalculation of non-ASCII faces and their fontsets if any
    non-ASCII faces are in the frame's face cache.  (Bug#72692)
---
 src/xfaces.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/src/xfaces.c b/src/xfaces.c
index 684b6ccfac7..bbc3448e457 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -733,9 +733,18 @@ recompute_basic_faces (struct frame *f)
 {
   if (FRAME_FACE_CACHE (f))
     {
+      bool non_basic_faces_cached =
+       FRAME_FACE_CACHE (f)->used > BASIC_FACE_ID_SENTINEL;
       clear_face_cache (false);
       if (!realize_basic_faces (f))
        emacs_abort ();
+      /* The call to realize_basic_faces above recomputed the basic
+         faces and freed their fontsets, but if there are non-ASCII
+         faces in the cache, they might now be invalid, and they
+         reference fontsets that are no longer in Vfontset_table.  We
+         therefore must force complete regeneration of all frame faces.  */
+      if (non_basic_faces_cached)
+       f->face_change = true;
     }
 }
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]