From f68decde57d662525fc87931204179596cc6ae09 Mon Sep 17 00:00:00 2001 From: Jonathan Blandford Date: Tue, 21 Jan 2003 05:50:29 +0000 Subject: [PATCH] correctly escape the file we're saving. Tue Jan 21 00:44:03 2003 Jonathan Blandford * gnome-theme-save.c (escape_string_and_dup): correctly escape the file we're saving. --- capplets/theme-switcher/ChangeLog | 5 ++ capplets/theme-switcher/gnome-theme-save.c | 59 ++++++++++++++++++++-- 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/capplets/theme-switcher/ChangeLog b/capplets/theme-switcher/ChangeLog index c73e15818..37781a881 100644 --- a/capplets/theme-switcher/ChangeLog +++ b/capplets/theme-switcher/ChangeLog @@ -1,3 +1,8 @@ +Tue Jan 21 00:44:03 2003 Jonathan Blandford + + * gnome-theme-save.c (escape_string_and_dup): correctly escape the + file we're saving. + Thu Jan 16 02:41:09 2003 Jonathan Blandford * Release 2.1.7 diff --git a/capplets/theme-switcher/gnome-theme-save.c b/capplets/theme-switcher/gnome-theme-save.c index 6d1f8df70..e70b23de8 100644 --- a/capplets/theme-switcher/gnome-theme-save.c +++ b/capplets/theme-switcher/gnome-theme-save.c @@ -12,6 +12,53 @@ enum INVALID_THEME_NAME, }; +/* taken from gnome-desktop-item.c */ +static char * +escape_string_and_dup (const char *s) +{ + char *return_value, *p; + const char *q; + int len = 0; + + if (s == NULL) + return g_strdup(""); + + q = s; + while (*q) + { + len++; + if (strchr ("\n\r\t\\", *q) != NULL) + len++; + q++; + } + return_value = p = (char *) g_malloc (len + 1); + do + { + switch (*s) + { + case '\t': + *p++ = '\\'; + *p++ = 't'; + break; + case '\n': + *p++ = '\\'; + *p++ = 'n'; + break; + case '\r': + *p++ = '\\'; + *p++ = 'r'; + break; + case '\\': + *p++ = '\\'; + *p++ = '\\'; + break; + default: + *p++ = *s; + } + } + while (*s++); + return return_value; +} static gboolean check_theme_name (const gchar *theme_name, @@ -126,6 +173,7 @@ save_dialog_response (GtkWidget *save_dialog, { GnomeThemeMetaInfo *meta_theme_info; char *theme_description = NULL; + char *theme_name = NULL; GError *error = NULL; if (response_id == GTK_RESPONSE_OK) @@ -134,21 +182,21 @@ save_dialog_response (GtkWidget *save_dialog, GtkWidget *entry; GtkWidget *text_view; GtkTextBuffer *buffer; - const char *theme_name; GtkTextIter start_iter; GtkTextIter end_iter; - + gchar *buffer_text; dialog = gnome_theme_manager_get_theme_dialog (); entry = WID ("save_dialog_entry"); - theme_name = gtk_entry_get_text (GTK_ENTRY (entry)); + theme_name = escape_string_and_dup (gtk_entry_get_text (GTK_ENTRY (entry))); text_view = WID ("save_dialog_textview"); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); gtk_text_buffer_get_start_iter (buffer, &start_iter); gtk_text_buffer_get_end_iter (buffer, &end_iter); - theme_description = gtk_text_buffer_get_text (buffer, &start_iter, &end_iter, FALSE); - + buffer_text = gtk_text_buffer_get_text (buffer, &start_iter, &end_iter, FALSE); + theme_description = escape_string_and_dup (buffer_text); + g_free (buffer_text); meta_theme_info = (GnomeThemeMetaInfo *) g_object_get_data (G_OBJECT (save_dialog), "meta-theme-info"); if (! save_theme_to_disk (meta_theme_info, theme_name, theme_description, &error)) { @@ -159,6 +207,7 @@ save_dialog_response (GtkWidget *save_dialog, out: g_clear_error (&error); gtk_widget_hide (save_dialog); + g_free (theme_name); g_free (theme_description); }