diff options
| author | Eli Zaretskii | 2018-05-05 11:52:29 +0300 |
|---|---|---|
| committer | Eli Zaretskii | 2018-05-05 11:52:29 +0300 |
| commit | e2879c1f837059335af89022b2a9ac9bc861e96d (patch) | |
| tree | 2ed4a8772ce6efcbbd4412740df71e98d98031a3 /src | |
| parent | bbe2cadc544e63e9378350621887f8fb9bbcc236 (diff) | |
| download | emacs-e2879c1f837059335af89022b2a9ac9bc861e96d.tar.gz emacs-e2879c1f837059335af89022b2a9ac9bc861e96d.zip | |
Avoid infloops in font_open_entity
* src/font.c (font_open_entity): Fail after 15 iterations through
the loop that looks for a font whose average_width and height are
both positive. This avoids infinite loops for fonts that, e.g.,
report average_width of zero for any possible size we try.
(Bug#31316)
Diffstat (limited to 'src')
| -rw-r--r-- | src/font.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/src/font.c b/src/font.c index ef3f92b5949..305bb14576a 100644 --- a/src/font.c +++ b/src/font.c | |||
| @@ -2906,6 +2906,9 @@ font_open_entity (struct frame *f, Lisp_Object entity, int pixel_size) | |||
| 2906 | font = XFONT_OBJECT (font_object); | 2906 | font = XFONT_OBJECT (font_object); |
| 2907 | if (font->average_width > 0 && font->height > 0) | 2907 | if (font->average_width > 0 && font->height > 0) |
| 2908 | break; | 2908 | break; |
| 2909 | /* Avoid an infinite loop. */ | ||
| 2910 | if (psize > pixel_size + 15) | ||
| 2911 | return Qnil; | ||
| 2909 | } | 2912 | } |
| 2910 | ASET (font_object, FONT_SIZE_INDEX, make_number (pixel_size)); | 2913 | ASET (font_object, FONT_SIZE_INDEX, make_number (pixel_size)); |
| 2911 | FONT_ADD_LOG ("open", entity, font_object); | 2914 | FONT_ADD_LOG ("open", entity, font_object); |