]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix rare segfaults due to freed fontsets
authorEli Zaretskii <eliz@gnu.org>
Thu, 29 Aug 2024 09:56:27 +0000 (12:56 +0300)
committerEshel Yaron <me@eshelyaron.com>
Wed, 4 Sep 2024 07:51:44 +0000 (09:51 +0200)
* 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)

(cherry picked from commit 13f69f254cfacfcc780b49c34e044b39dc333732)

src/xfaces.c

index 684b6ccfac72db4fc5ac22fb1b7b77d8bd43eb12..bbc3448e4578ac2e94a38a2e772436954e3d0b3d 100644 (file)
@@ -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;
     }
 }