talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 4dd26ecd7748e2844ed30d436660d05a861ce6cb
parent 4809976d9e97d0880b43dd6c25f3bbec8c7a9ccf
Author: Ricardo Mones <mones@claws-mail.org>
Date:   Sat,  6 Oct 2012 20:15:31 +0000

2012-10-06 [mones]	3.8.1cvs85

	* po/POTFILES.in
		Added src/gtk/menu.c
	* src/common/defs.h
	* src/gtk/menu.c
	* src/gtk/menu.h
		New function cm_menu_item_new_label_from_url to
		avoid crashing on huge URL strings and warn user
		about the possible causes
	* src/mainwindow.c
		Use it to create List menu items safely

Diffstat:
MChangeLog | 13+++++++++++++
MPATCHSETS | 1+
Mconfigure.ac | 2+-
Mpo/POTFILES.in | 1+
Msrc/common/defs.h | 3+++
Msrc/gtk/menu.c | 18++++++++++++++++++
Msrc/gtk/menu.h | 2++
Msrc/mainwindow.c | 4++--
8 files changed, 41 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,16 @@ +2012-10-06 [mones] 3.8.1cvs85 + + * po/POTFILES.in + Added src/gtk/menu.c + * src/common/defs.h + * src/gtk/menu.c + * src/gtk/menu.h + New function cm_menu_item_new_label_from_url to + avoid crashing on huge URL strings and warn user + about the possible causes + * src/mainwindow.c + Use it to create List menu items safely + 2012-10-04 [colin] 3.8.1cvs84 * src/imap.c diff --git a/PATCHSETS b/PATCHSETS @@ -4459,3 +4459,4 @@ ( cvs diff -u -r 1.49.2.152 -r 1.49.2.153 src/procmime.c; ) > 3.8.1cvs82.patchset ( cvs diff -u -r 1.1.2.5 -r 1.1.2.6 src/advsearch.c; ) > 3.8.1cvs83.patchset ( cvs diff -u -r 1.179.2.266 -r 1.179.2.267 src/imap.c; ) > 3.8.1cvs84.patchset +( cvs diff -u -r 1.53.2.38 -r 1.53.2.39 po/POTFILES.in; cvs diff -u -r 1.274.2.353 -r 1.274.2.354 src/mainwindow.c; cvs diff -u -r 1.9.2.59 -r 1.9.2.60 src/common/defs.h; cvs diff -u -r 1.5.2.47 -r 1.5.2.48 src/gtk/menu.c; cvs diff -u -r 1.4.2.27 -r 1.4.2.28 src/gtk/menu.h; ) > 3.8.1cvs85.patchset diff --git a/configure.ac b/configure.ac @@ -12,7 +12,7 @@ MINOR_VERSION=8 MICRO_VERSION=1 INTERFACE_AGE=0 BINARY_AGE=0 -EXTRA_VERSION=84 +EXTRA_VERSION=85 EXTRA_RELEASE= EXTRA_GTK2_VERSION= diff --git a/po/POTFILES.in b/po/POTFILES.in @@ -48,6 +48,7 @@ src/gtk/headers.h src/gtk/icon_legend.c src/gtk/inputdialog.c src/gtk/logwindow.c +src/gtk/menu.c src/gtk/pluginwindow.c src/gtk/prefswindow.c src/gtk/progressdialog.c diff --git a/src/common/defs.h b/src/common/defs.h @@ -174,6 +174,9 @@ #define VSPACING_NARROW_2 2 #define VBOX_BORDER 8 #define DEFAULT_ENTRY_WIDTH 80 +/* labels bigger than this causes crash with the X Window System error: + 'BadAlloc (insufficient resources for operation)' */ +#define MAX_MENU_LABEL_LENGTH 5453 #define BOLD_FONT prefs_common.boldfont #define NORMAL_FONT prefs_common.normalfont diff --git a/src/gtk/menu.c b/src/gtk/menu.c @@ -32,6 +32,7 @@ #include "menu.h" #include "utils.h" #include "gtkutils.h" +#include "defs.h" #ifdef MAEMO #ifdef CHINOOK @@ -133,6 +134,23 @@ gchar *cm_menu_item_get_shortcut(GtkUIManager *gui_manager, gchar *menu) } +GtkWidget *cm_menu_item_new_label_from_url(gchar *url) +{ + gint len = strlen(url); + if (len > MAX_MENU_LABEL_LENGTH) { + g_message("Refusing a %d bytes string as menu label\n", len); + url[64] = '\0', url[63] = url[62] = url[61] = '.', url[60] = ' '; + GtkWidget *newlabel = gtk_menu_item_new_with_label(url); + gtk_widget_set_tooltip_markup(GTK_WIDGET(newlabel), + _("<span><b>Warning:</b> This URL was too long for displaying and\n" + "has been truncated for safety. This message could be\n" + "corrupted, malformed or part of some DoS attempt.</span>")); + return newlabel; + } + + return gtk_menu_item_new_with_label(url); +} + void cm_toggle_menu_set_active_full(GtkUIManager *gui_manager, gchar *menu, gboolean active) { GtkWidget *widget; diff --git a/src/gtk/menu.h b/src/gtk/menu.h @@ -94,6 +94,8 @@ void cm_toggle_menu_set_active(gchar *menu, gboolean active); void cm_menu_set_sensitive_full(GtkUIManager *gui_manager, gchar *menu, gboolean sensitive); void cm_toggle_menu_set_active_full(GtkUIManager *gui_manager, gchar *menu, gboolean active); gchar *cm_menu_item_get_shortcut(GtkUIManager *gui_manager, gchar *menu); +GtkWidget *cm_menu_item_new_label_from_url(gchar *label); + #if !GTK_CHECK_VERSION(3, 0, 0) gint menu_find_option_menu_index(GtkCMOptionMenu *optmenu, gpointer data, GCompareFunc func); diff --git a/src/mainwindow.c b/src/mainwindow.c @@ -3564,7 +3564,7 @@ static gint mailing_list_populate_submenu (GtkWidget *menuitem, const gchar * li get_url_part (&url_pt, url_decoded); item = NULL; if (!g_ascii_strncasecmp(url_decoded, "mailto:", 7)) { - item = gtk_menu_item_new_with_label ((url_decoded)); + item = cm_menu_item_new_label_from_url ((url_decoded)); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(mailing_list_compose), NULL); @@ -3572,7 +3572,7 @@ static gint mailing_list_populate_submenu (GtkWidget *menuitem, const gchar * li else if (!g_ascii_strncasecmp(url_decoded, "http:", 5) || !g_ascii_strncasecmp(url_decoded, "https:",6)) { - item = gtk_menu_item_new_with_label ((url_decoded)); + item = cm_menu_item_new_label_from_url ((url_decoded)); g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(mailing_list_open_uri), NULL);