aboutsummaryrefslogtreecommitdiffstats
path: root/src/xsettings.c
diff options
context:
space:
mode:
authorPaul Eggert2014-02-28 13:45:34 -0800
committerPaul Eggert2014-02-28 13:45:34 -0800
commit8268febfe0c336ff47a61d0d416fd4bebf61a993 (patch)
tree4a1590e6aff922e69646cc35347192ea507b1c7a /src/xsettings.c
parentb70257b07ea6053bce27b20ad0bda50f547bd393 (diff)
downloademacs-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.c23
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 (&current_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 (&current_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 (&current_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 (&current_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 (&current_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 (&current_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 (&current_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,