diff options
author | Philipp Stephani <phst@google.com> | 2020-11-09 22:14:39 +0100 |
---|---|---|
committer | Philipp Stephani <phst@google.com> | 2020-11-09 22:14:39 +0100 |
commit | 109eb1e7e29455418b40ca00bf5dad3e61e5fc78 (patch) | |
tree | 14f6331054999932a0e76e0b0200c35321fb8ea9 | |
parent | 78e1646bf7bde8f00c196319f4803e98460d506a (diff) | |
download | emacs-109eb1e7e29455418b40ca00bf5dad3e61e5fc78.tar.gz |
Fix undefined behavior when fetching glyphs from the display vector.
You can trigger this rather obscure bug by enabling selective display
if the second glyph in its display vector has an invalid face. For
example, evaluate
(set-display-table-slot standard-display-table
'selective-display [?A (?B . invalid)])
and then enable selective display.
* src/xdisp.c (next_element_from_display_vector): Check whether next
glyph code is valid before accessing it.
-rw-r--r-- | src/xdisp.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/xdisp.c b/src/xdisp.c index ac706d08414..71a5f1c34f0 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -8221,10 +8221,10 @@ next_element_from_display_vector (struct it *it) next_face_id = it->dpvec_face_id; else { - int lface_id = - GLYPH_CODE_FACE (it->dpvec[it->current.dpvec_index + 1]); + Lisp_Object gc = it->dpvec[it->current.dpvec_index + 1]; + int lface_id = GLYPH_CODE_P (gc) ? GLYPH_CODE_FACE (gc) : 0; - if (lface_id > 0) + if (lface_id > 0) next_face_id = merge_faces (it->w, Qt, lface_id, it->saved_face_id); } |