diff options
| author | Paul Eggert | 2014-02-28 13:45:34 -0800 |
|---|---|---|
| committer | Paul Eggert | 2014-02-28 13:45:34 -0800 |
| commit | 8268febfe0c336ff47a61d0d416fd4bebf61a993 (patch) | |
| tree | 4a1590e6aff922e69646cc35347192ea507b1c7a /src/xsettings.c | |
| parent | b70257b07ea6053bce27b20ad0bda50f547bd393 (diff) | |
| download | emacs-8268febfe0c336ff47a61d0d416fd4bebf61a993.tar.gz emacs-8268febfe0c336ff47a61d0d416fd4bebf61a993.zip | |
Fix a few crashes and leaks when cloning C strings.
* alloc.c, lisp.h (dupstring): New function.
* gtkutil.c (xg_get_font):
* term.c (tty_default_color_capabilities):
* xsettings.c (store_monospaced_changed)
(store_font_name_changed, parse_settings)
(read_and_apply_settings, init_gsettings, init_gconf): Use it.
This avoids some unlikely crashes due to accessing freed storage,
and avoids some minor memory leaks in the more-typical case.
Diffstat (limited to 'src/xsettings.c')
| -rw-r--r-- | src/xsettings.c | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/src/xsettings.c b/src/xsettings.c index 458c3d45e9a..844da19f638 100644 --- a/src/xsettings.c +++ b/src/xsettings.c | |||
| @@ -91,8 +91,7 @@ store_monospaced_changed (const char *newfont) | |||
| 91 | if (current_mono_font != NULL && strcmp (newfont, current_mono_font) == 0) | 91 | if (current_mono_font != NULL && strcmp (newfont, current_mono_font) == 0) |
| 92 | return; /* No change. */ | 92 | return; /* No change. */ |
| 93 | 93 | ||
| 94 | xfree (current_mono_font); | 94 | dupstring (¤t_mono_font, newfont); |
| 95 | current_mono_font = xstrdup (newfont); | ||
| 96 | 95 | ||
| 97 | if (dpyinfo_valid (first_dpyinfo) && use_system_font) | 96 | if (dpyinfo_valid (first_dpyinfo) && use_system_font) |
| 98 | { | 97 | { |
| @@ -111,8 +110,7 @@ store_font_name_changed (const char *newfont) | |||
| 111 | if (current_font != NULL && strcmp (newfont, current_font) == 0) | 110 | if (current_font != NULL && strcmp (newfont, current_font) == 0) |
| 112 | return; /* No change. */ | 111 | return; /* No change. */ |
| 113 | 112 | ||
| 114 | xfree (current_font); | 113 | dupstring (¤t_font, newfont); |
| 115 | current_font = xstrdup (newfont); | ||
| 116 | 114 | ||
| 117 | if (dpyinfo_valid (first_dpyinfo)) | 115 | if (dpyinfo_valid (first_dpyinfo)) |
| 118 | { | 116 | { |
| @@ -492,13 +490,13 @@ parse_settings (unsigned char *prop, | |||
| 492 | ++settings_seen; | 490 | ++settings_seen; |
| 493 | if (strcmp (name, XSETTINGS_TOOL_BAR_STYLE) == 0) | 491 | if (strcmp (name, XSETTINGS_TOOL_BAR_STYLE) == 0) |
| 494 | { | 492 | { |
| 495 | settings->tb_style = xstrdup (sval); | 493 | dupstring (&settings->tb_style, sval); |
| 496 | settings->seen |= SEEN_TB_STYLE; | 494 | settings->seen |= SEEN_TB_STYLE; |
| 497 | } | 495 | } |
| 498 | #ifdef HAVE_XFT | 496 | #ifdef HAVE_XFT |
| 499 | else if (strcmp (name, XSETTINGS_FONT_NAME) == 0) | 497 | else if (strcmp (name, XSETTINGS_FONT_NAME) == 0) |
| 500 | { | 498 | { |
| 501 | settings->font = xstrdup (sval); | 499 | dupstring (&settings->font, sval); |
| 502 | settings->seen |= SEEN_FONT; | 500 | settings->seen |= SEEN_FONT; |
| 503 | } | 501 | } |
| 504 | else if (strcmp (name, "Xft/Antialias") == 0) | 502 | else if (strcmp (name, "Xft/Antialias") == 0) |
| @@ -742,10 +740,7 @@ read_and_apply_settings (struct x_display_info *dpyinfo, int send_event_p) | |||
| 742 | if (send_event_p) | 740 | if (send_event_p) |
| 743 | store_font_name_changed (settings.font); | 741 | store_font_name_changed (settings.font); |
| 744 | else | 742 | else |
| 745 | { | 743 | dupstring (¤t_font, settings.font); |
| 746 | xfree (current_font); | ||
| 747 | current_font = xstrdup (settings.font); | ||
| 748 | } | ||
| 749 | xfree (settings.font); | 744 | xfree (settings.font); |
| 750 | } | 745 | } |
| 751 | #endif | 746 | #endif |
| @@ -835,7 +830,7 @@ init_gsettings (void) | |||
| 835 | { | 830 | { |
| 836 | g_variant_ref_sink (val); | 831 | g_variant_ref_sink (val); |
| 837 | if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING)) | 832 | if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING)) |
| 838 | current_mono_font = xstrdup (g_variant_get_string (val, NULL)); | 833 | dupstring (¤t_mono_font, g_variant_get_string (val, NULL)); |
| 839 | g_variant_unref (val); | 834 | g_variant_unref (val); |
| 840 | } | 835 | } |
| 841 | 836 | ||
| @@ -844,7 +839,7 @@ init_gsettings (void) | |||
| 844 | { | 839 | { |
| 845 | g_variant_ref_sink (val); | 840 | g_variant_ref_sink (val); |
| 846 | if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING)) | 841 | if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING)) |
| 847 | current_font = xstrdup (g_variant_get_string (val, NULL)); | 842 | dupstring (¤t_font, g_variant_get_string (val, NULL)); |
| 848 | g_variant_unref (val); | 843 | g_variant_unref (val); |
| 849 | } | 844 | } |
| 850 | #endif /* HAVE_XFT */ | 845 | #endif /* HAVE_XFT */ |
| @@ -886,13 +881,13 @@ init_gconf (void) | |||
| 886 | s = gconf_client_get_string (gconf_client, GCONF_MONO_FONT, NULL); | 881 | s = gconf_client_get_string (gconf_client, GCONF_MONO_FONT, NULL); |
| 887 | if (s) | 882 | if (s) |
| 888 | { | 883 | { |
| 889 | current_mono_font = xstrdup (s); | 884 | dupstring (¤t_mono_font, s); |
| 890 | g_free (s); | 885 | g_free (s); |
| 891 | } | 886 | } |
| 892 | s = gconf_client_get_string (gconf_client, GCONF_FONT_NAME, NULL); | 887 | s = gconf_client_get_string (gconf_client, GCONF_FONT_NAME, NULL); |
| 893 | if (s) | 888 | if (s) |
| 894 | { | 889 | { |
| 895 | current_font = xstrdup (s); | 890 | dupstring (¤t_font, s); |
| 896 | g_free (s); | 891 | g_free (s); |
| 897 | } | 892 | } |
| 898 | gconf_client_add_dir (gconf_client, | 893 | gconf_client_add_dir (gconf_client, |