diff options
| author | Po Lu | 2022-05-15 09:30:07 +0800 |
|---|---|---|
| committer | Po Lu | 2022-05-15 09:30:07 +0800 |
| commit | 8e592973782e38be75faed39f557642bbae6aec5 (patch) | |
| tree | cc10539ed6995f6d966cefd7f48006608f1c80a3 /src | |
| parent | 003dc93f93994c1fc568a7844623fa65f9d33448 (diff) | |
| download | emacs-8e592973782e38be75faed39f557642bbae6aec5.tar.gz emacs-8e592973782e38be75faed39f557642bbae6aec5.zip | |
Prevent crashes trying to access nonexistent key
* src/xsettings.c (xg_settings_key_valid_p): New function.
(apply_gsettings_font_antialias): Test that `font-aliasing' is
actually available. (bug#55416)
Diffstat (limited to 'src')
| -rw-r--r-- | src/xsettings.c | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/src/xsettings.c b/src/xsettings.c index e71887e03d9..16625bd229f 100644 --- a/src/xsettings.c +++ b/src/xsettings.c | |||
| @@ -268,17 +268,47 @@ apply_gsettings_font_hinting (GSettings *settings) | |||
| 268 | } | 268 | } |
| 269 | } | 269 | } |
| 270 | 270 | ||
| 271 | static bool | ||
| 272 | xg_settings_key_valid_p (GSettings *settings, const char *key) | ||
| 273 | { | ||
| 274 | #ifdef GLIB_VERSION_2_32 | ||
| 275 | GSettingsSchema *schema; | ||
| 276 | bool rc; | ||
| 277 | |||
| 278 | g_object_get (G_OBJECT (settings), | ||
| 279 | "settings-schema", &schema, | ||
| 280 | NULL); | ||
| 281 | |||
| 282 | if (!schema) | ||
| 283 | return false; | ||
| 284 | |||
| 285 | rc = g_settings_schema_has_key (schema, key); | ||
| 286 | g_settings_schema_unref (schema); | ||
| 287 | |||
| 288 | return rc; | ||
| 289 | #else | ||
| 290 | return false; | ||
| 291 | #endif | ||
| 292 | } | ||
| 293 | |||
| 271 | /* Apply changes in the antialiasing system setting. */ | 294 | /* Apply changes in the antialiasing system setting. */ |
| 272 | static void | 295 | static void |
| 273 | apply_gsettings_font_antialias (GSettings *settings) | 296 | apply_gsettings_font_antialias (GSettings *settings) |
| 274 | { | 297 | { |
| 275 | GVariant *val = g_settings_get_value (settings, GSETTINGS_FONT_ANTIALIASING); | 298 | GVariant *val; |
| 299 | const char *antialias; | ||
| 300 | |||
| 301 | if (!xg_settings_key_valid_p (settings, GSETTINGS_FONT_ANTIALIASING)) | ||
| 302 | return; | ||
| 303 | |||
| 304 | val = g_settings_get_value (settings, GSETTINGS_FONT_ANTIALIASING); | ||
| 305 | |||
| 276 | if (val) | 306 | if (val) |
| 277 | { | 307 | { |
| 278 | g_variant_ref_sink (val); | 308 | g_variant_ref_sink (val); |
| 279 | if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING)) | 309 | if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING)) |
| 280 | { | 310 | { |
| 281 | const char *antialias = g_variant_get_string (val, NULL); | 311 | antialias = g_variant_get_string (val, NULL); |
| 282 | 312 | ||
| 283 | if (!strcmp (antialias, "none")) | 313 | if (!strcmp (antialias, "none")) |
| 284 | cairo_font_options_set_antialias (font_options, | 314 | cairo_font_options_set_antialias (font_options, |