]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix UB in line_hash_code
authorPaul Eggert <eggert@cs.ucla.edu>
Tue, 22 Oct 2024 19:18:14 +0000 (12:18 -0700)
committerEshel Yaron <me@eshelyaron.com>
Mon, 23 Dec 2024 14:53:24 +0000 (15:53 +0100)
* src/dispnew.c (line_hash_code): Avoid undefined behavior on
integer overflow.

(cherry picked from commit dac51f1f66ef93cec6d9ea17e74a193de9ae1ff3)

src/dispnew.c

index 9caeb9d1694770460231648965b0b9f04aa5967f..1ece9cc1d4568ae59934f1ddbaa8ba96e4dac422 100644 (file)
@@ -1175,15 +1175,12 @@ line_hash_code (struct frame *f, struct glyph_row *row)
       while (glyph < end)
        {
          int c = glyph->u.ch;
-         int face_id = glyph->face_id;
-         /* A given row of a frame glyph matrix could have glyphs
-            from more than one frame, if child frames are displayed.
-            Since face_id of a face depends on the frame (it's an
-            index into the frame's face cache), we need the hash
-            value to include something specific to the frame, and we
-            use the frame cache's address for that purpose.  */
+         unsigned int face_id = glyph->face_id;
+         /* Struct frame can move with igc, and so on.  But we need
+            something that takes different frames into account.  Use the
+            face_cache pointer for that which is malloc'd.  */
          if (glyph->frame && glyph->frame != f)
-           face_id += (ptrdiff_t) glyph->frame->face_cache;
+           face_id += (uintptr_t) glyph->frame->face_cache;
          if (FRAME_MUST_WRITE_SPACES (f))
            c -= SPACEGLYPH;
          hash = (((hash << 4) + (hash >> 24)) & 0x0fffffff) + c;