diff options
| author | Eli Zaretskii | 2021-12-30 20:28:58 +0200 |
|---|---|---|
| committer | Eli Zaretskii | 2021-12-30 20:28:58 +0200 |
| commit | 89f205084b7368bb2261e07384f8ff1967a70ba4 (patch) | |
| tree | ee992e95dfb4afcce096a634338b628ab9f68436 /src | |
| parent | f2031d0ddb6a21eebbf396094a5c4d4e73019271 (diff) | |
| download | emacs-89f205084b7368bb2261e07384f8ff1967a70ba4.tar.gz emacs-89f205084b7368bb2261e07384f8ff1967a70ba4.zip | |
Avoid assertion violations with variable-weight fonts
* src/font.c (font_score, font_delete_unmatched): Don't assume
weight, slant, and width properties of the font must be fixnums:
some variable-weight fonts violate that assumption. Reported
by Sean Whitton <spwhitton@spwhitton.name>. Do not merge to
master. (Bug#52888)
Diffstat (limited to 'src')
| -rw-r--r-- | src/font.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/font.c b/src/font.c index c0050a99cfe..6ff28397d95 100644 --- a/src/font.c +++ b/src/font.c | |||
| @@ -2170,7 +2170,9 @@ font_score (Lisp_Object entity, Lisp_Object *spec_prop) | |||
| 2170 | 2170 | ||
| 2171 | /* Score three style numeric fields. Maximum difference is 127. */ | 2171 | /* Score three style numeric fields. Maximum difference is 127. */ |
| 2172 | for (i = FONT_WEIGHT_INDEX; i <= FONT_WIDTH_INDEX; i++) | 2172 | for (i = FONT_WEIGHT_INDEX; i <= FONT_WIDTH_INDEX; i++) |
| 2173 | if (! NILP (spec_prop[i]) && ! EQ (AREF (entity, i), spec_prop[i])) | 2173 | if (! NILP (spec_prop[i]) |
| 2174 | && ! EQ (AREF (entity, i), spec_prop[i]) | ||
| 2175 | && FIXNUMP (AREF (entity, i))) | ||
| 2174 | { | 2176 | { |
| 2175 | EMACS_INT diff = ((XFIXNUM (AREF (entity, i)) >> 8) | 2177 | EMACS_INT diff = ((XFIXNUM (AREF (entity, i)) >> 8) |
| 2176 | - (XFIXNUM (spec_prop[i]) >> 8)); | 2178 | - (XFIXNUM (spec_prop[i]) >> 8)); |
| @@ -2749,8 +2751,9 @@ font_delete_unmatched (Lisp_Object vec, Lisp_Object spec, int size) | |||
| 2749 | } | 2751 | } |
| 2750 | for (prop = FONT_WEIGHT_INDEX; prop < FONT_SIZE_INDEX; prop++) | 2752 | for (prop = FONT_WEIGHT_INDEX; prop < FONT_SIZE_INDEX; prop++) |
| 2751 | if (FIXNUMP (AREF (spec, prop)) | 2753 | if (FIXNUMP (AREF (spec, prop)) |
| 2752 | && ((XFIXNUM (AREF (spec, prop)) >> 8) | 2754 | && ! (FIXNUMP (AREF (entity, prop)) |
| 2753 | != (XFIXNUM (AREF (entity, prop)) >> 8))) | 2755 | && ((XFIXNUM (AREF (spec, prop)) >> 8) |
| 2756 | == (XFIXNUM (AREF (entity, prop)) >> 8)))) | ||
| 2754 | prop = FONT_SPEC_MAX; | 2757 | prop = FONT_SPEC_MAX; |
| 2755 | if (prop < FONT_SPEC_MAX | 2758 | if (prop < FONT_SPEC_MAX |
| 2756 | && size | 2759 | && size |