* 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.
+2014-02-28 Paul Eggert <eggert@penguin.cs.ucla.edu>
+
+ 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.
+
2014-02-28 Martin Rudalics <rudalics@gmx.at>
* xdisp.c (note_mode_line_or_margin_highlight): Don't show drag
return memcpy (xmalloc (size), SSDATA (string), size);
}
+/* Assign to *PTR a copy of STRING, freeing any storage *PTR formerly
+ pointed to. If STRING is null, assign it without copying anything.
+ Allocate before freeing, to avoid a dangling pointer if allocation
+ fails. */
+
+void
+dupstring (char **ptr, char const *string)
+{
+ char *old = *ptr;
+ *ptr = string ? xstrdup (string) : 0;
+ xfree (old);
+}
+
+
/* Like putenv, but (1) use the equivalent of xmalloc and (2) the
argument is a const pointer. */
font = Ffont_spec (8, args);
pango_font_description_free (desc);
- xfree (x_last_font_name);
- x_last_font_name = xstrdup (name);
+ dupstring (&x_last_font_name, name);
}
#else /* Use old font selector, which just returns the font name. */
extern char *xstrdup (const char *);
extern char *xlispstrdup (Lisp_Object);
+extern void dupstring (char **, char const *);
extern void xputenv (const char *);
extern char *egetenv (const char *);
if (save)
{
- xfree (default_orig_pair);
- default_orig_pair = tty->TS_orig_pair ? xstrdup (tty->TS_orig_pair) : NULL;
-
- xfree (default_set_foreground);
- default_set_foreground = tty->TS_set_foreground ? xstrdup (tty->TS_set_foreground)
- : NULL;
-
- xfree (default_set_background);
- default_set_background = tty->TS_set_background ? xstrdup (tty->TS_set_background)
- : NULL;
-
+ dupstring (&default_orig_pair, tty->TS_orig_pair);
+ dupstring (&default_set_foreground, tty->TS_set_foreground);
+ dupstring (&default_set_background, tty->TS_set_background);
default_max_colors = tty->TN_max_colors;
default_max_pairs = tty->TN_max_pairs;
default_no_color_video = tty->TN_no_color_video;
if (current_mono_font != NULL && strcmp (newfont, current_mono_font) == 0)
return; /* No change. */
- xfree (current_mono_font);
- current_mono_font = xstrdup (newfont);
+ dupstring (¤t_mono_font, newfont);
if (dpyinfo_valid (first_dpyinfo) && use_system_font)
{
if (current_font != NULL && strcmp (newfont, current_font) == 0)
return; /* No change. */
- xfree (current_font);
- current_font = xstrdup (newfont);
+ dupstring (¤t_font, newfont);
if (dpyinfo_valid (first_dpyinfo))
{
++settings_seen;
if (strcmp (name, XSETTINGS_TOOL_BAR_STYLE) == 0)
{
- settings->tb_style = xstrdup (sval);
+ dupstring (&settings->tb_style, sval);
settings->seen |= SEEN_TB_STYLE;
}
#ifdef HAVE_XFT
else if (strcmp (name, XSETTINGS_FONT_NAME) == 0)
{
- settings->font = xstrdup (sval);
+ dupstring (&settings->font, sval);
settings->seen |= SEEN_FONT;
}
else if (strcmp (name, "Xft/Antialias") == 0)
if (send_event_p)
store_font_name_changed (settings.font);
else
- {
- xfree (current_font);
- current_font = xstrdup (settings.font);
- }
+ dupstring (¤t_font, settings.font);
xfree (settings.font);
}
#endif
{
g_variant_ref_sink (val);
if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING))
- current_mono_font = xstrdup (g_variant_get_string (val, NULL));
+ dupstring (¤t_mono_font, g_variant_get_string (val, NULL));
g_variant_unref (val);
}
{
g_variant_ref_sink (val);
if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING))
- current_font = xstrdup (g_variant_get_string (val, NULL));
+ dupstring (¤t_font, g_variant_get_string (val, NULL));
g_variant_unref (val);
}
#endif /* HAVE_XFT */
s = gconf_client_get_string (gconf_client, GCONF_MONO_FONT, NULL);
if (s)
{
- current_mono_font = xstrdup (s);
+ dupstring (¤t_mono_font, s);
g_free (s);
}
s = gconf_client_get_string (gconf_client, GCONF_FONT_NAME, NULL);
if (s)
{
- current_font = xstrdup (s);
+ dupstring (¤t_font, s);
g_free (s);
}
gconf_client_add_dir (gconf_client,