2012-10-06 [mones] 3.8.1cvs85
authorRicardo Mones <mones@claws-mail.org>
Sat, 6 Oct 2012 20:15:31 +0000 (20:15 +0000)
committerRicardo Mones <mones@claws-mail.org>
Sat, 6 Oct 2012 20:15:31 +0000 (20:15 +0000)
* 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

ChangeLog
PATCHSETS
configure.ac
po/POTFILES.in
src/common/defs.h
src/gtk/menu.c
src/gtk/menu.h
src/mainwindow.c

index dc4ab23f30a2cae644ba22ac0151384f5d13a064..d938f27ed1dc2d7db56d6fa692b2dd53c7b334a6 100644 (file)
--- 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
index 72aad7e58870e59d7240db912ece79631bbbf8bb..a8c2559615a41f7fb496c44fec426ce6835d922d 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( 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
index c5f34e5a460653d33df9630c441e55edd4b7f3cb..29a769d4ad0ce25daf9ac903188eaa52c385ae1e 100644 (file)
@@ -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=
 
index 725e131b16a338b17ab4317a7751396cae51f9f0..7970a5d7369cf185eeeb19f399bebf3db3cb0982 100644 (file)
@@ -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
index 95e364028108a8057043ccc0272a10301ac33c32..a21cc151829b36d2484b1116e4a467f8c24a62e0 100644 (file)
 #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
index 0684b6fa753a0dc028d45c42bbb680c301ef9f8a..c08c5fcf89a590c0acb0c765a2716e7e3e01448d 100644 (file)
@@ -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;
index 9342ebd73b60d36122f2f30a41b1793e4bc0d0c2..d4204f8944c78e67724143d614b8d44dafc3aa1f 100644 (file)
@@ -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);
index 03535fbf74e9ec9e2dedeb5ef0511b5e112289f9..47aee19fbfc9a0805110858d7b4d5fe7a900a3ae 100644 (file)
@@ -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);