/pidgin/main: 738096bade99: gtkblist: Avoid calling the 'select ...

dx dx at dxzone.com.ar
Sat May 14 22:49:15 EDT 2016


Changeset: 738096bade995d4c38940b5bca9404003948911d
Author:	 dx <dx at dxzone.com.ar>
Date:	 2016-05-14 17:55 -0300
Branch:	 release-2.x.y
URL: https://hg.pidgin.im/pidgin/main/rev/738096bade99

Description:

gtkblist: Avoid calling the 'select notebook page' timeout after destroy

This showed up as a use-after-free in valgrind, when quitting

diffstat:

 ChangeLog         |   1 +
 pidgin/gtkblist.c |  12 +++++++++++-
 2 files changed, 12 insertions(+), 1 deletions(-)

diffs (54 lines):

diff --git a/ChangeLog b/ChangeLog
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,7 @@ version 2.10.13 (MM/DD/YY):
 	* Fixed #14962
 	* Fixed alignment of incoming right-to-left messages in protocols that
 	don't support rich text
+	* Fix a potential crash while exiting pidgin
 
 	Windows-Specific Changes:
 	* Use getaddrinfo for DNS to enable IPv6 (#1075)
diff --git a/pidgin/gtkblist.c b/pidgin/gtkblist.c
--- a/pidgin/gtkblist.c
+++ b/pidgin/gtkblist.c
@@ -119,6 +119,8 @@ typedef struct
 	PidginMiniDialog *signed_on_elsewhere;
 
 	PidginBlistTheme *current_theme;
+
+	guint select_page_timeout;       /**< The timeout for pidgin_blist_select_notebook_page_cb */
 } PidginBuddyListPrivate;
 
 #define PIDGIN_BUDDY_LIST_GET_PRIVATE(list) \
@@ -4875,6 +4877,8 @@ static gboolean pidgin_blist_select_note
 
 	priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
 
+	priv->select_page_timeout = 0;
+
 	/* this is far too ugly thanks to me not wanting to fix #3989 properly right now */
 	if (priv->error_scrollbook != NULL) {
 		errors = gtk_notebook_get_n_pages(GTK_NOTEBOOK(priv->error_scrollbook->notebook));
@@ -4890,7 +4894,11 @@ static gboolean pidgin_blist_select_note
 
 static void pidgin_blist_select_notebook_page(PidginBuddyList *gtkblist)
 {
-	purple_timeout_add(0, pidgin_blist_select_notebook_page_cb, gtkblist);
+	PidginBuddyListPrivate *priv;
+
+	priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
+
+	priv->select_page_timeout = purple_timeout_add(0, pidgin_blist_select_notebook_page_cb, gtkblist);
 }
 
 static void account_modified(PurpleAccount *account, PidginBuddyList *gtkblist)
@@ -6902,6 +6910,8 @@ static void pidgin_blist_destroy(PurpleB
 	priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
 	if (priv->current_theme)
 		g_object_unref(priv->current_theme);
+	if (priv->select_page_timeout)
+		purple_timeout_remove(priv->select_page_timeout);
 	g_free(priv);
 
 	g_free(gtkblist);



More information about the Commits mailing list