r1648 - in /unstable/evolution/debian: changelog patches/04_fix-crash-when-viewing-closing-mails-quickly_1.patch patches/04_fix-crash-when-viewing-closing-mails-quickly_2.patch
corsac at users.alioth.debian.org
corsac at users.alioth.debian.org
Mon May 24 08:26:36 UTC 2010
Author: corsac
Date: Mon May 24 08:26:34 2010
New Revision: 1648
URL: http://svn.debian.org/wsvn/pkg-evolution/?sc=1&rev=1648
Log:
04_fix-crash-when-viewing-closing-mails-quickly_{1,2} added,
cherry-picked from upstream. Fix crash when opening/closing mails
quickly. closes: #582564
Added:
unstable/evolution/debian/patches/04_fix-crash-when-viewing-closing-mails-quickly_1.patch
unstable/evolution/debian/patches/04_fix-crash-when-viewing-closing-mails-quickly_2.patch
Modified:
unstable/evolution/debian/changelog
Modified: unstable/evolution/debian/changelog
URL: http://svn.debian.org/wsvn/pkg-evolution/unstable/evolution/debian/changelog?rev=1648&op=diff
==============================================================================
--- unstable/evolution/debian/changelog (original)
+++ unstable/evolution/debian/changelog Mon May 24 08:26:34 2010
@@ -2,12 +2,15 @@
* debian/patches
- 03_fix-segfault-on-some-mails-display added. closes: #580419
+ - 04_fix-crash-when-viewing-closing-mails-quickly_{1,2} added,
+ cherry-picked from upstream. Fix crash when opening/closing mails
+ quickly. closes: #582564
* debian/evolution.links dropped, upstream doesn't ship them in /usr/bin for
good reason, they're supposed to be called from evolution not directly by
user, and the interface might not be stable. closes: #582491
* debian/watch updated to order the first directory too.
- -- Yves-Alexis Perez <corsac at debian.org> Mon, 24 May 2010 10:20:44 +0200
+ -- Yves-Alexis Perez <corsac at debian.org> Mon, 24 May 2010 10:23:23 +0200
evolution (2.30.1.2-2) unstable; urgency=low
Added: unstable/evolution/debian/patches/04_fix-crash-when-viewing-closing-mails-quickly_1.patch
URL: http://svn.debian.org/wsvn/pkg-evolution/unstable/evolution/debian/patches/04_fix-crash-when-viewing-closing-mails-quickly_1.patch?rev=1648&op=file
==============================================================================
--- unstable/evolution/debian/patches/04_fix-crash-when-viewing-closing-mails-quickly_1.patch (added)
+++ unstable/evolution/debian/patches/04_fix-crash-when-viewing-closing-mails-quickly_1.patch Mon May 24 08:26:34 2010
@@ -1,0 +1,151 @@
+commit bc054c94cb46e4f8f8881c2a1b0268e2f05b307b
+Author: Matthew Barnes <mbarnes at redhat.com>
+Date: Tue May 18 08:07:19 2010 -0400
+
+ Bug 618902 - Crash when viewing/closing messages quickly
+
+ Closing an EMailBrowser window causes it to be disposed immediately,
+ but ongoing async operations still hold an EMailBrowser reference --
+ in particular, regenerating the internal message list and fetching a
+ mail message. The callback functions for these operations were not
+ equipped to deal with the disposed-but-not-yet-finalized object.
+
+diff --git a/mail/e-mail-browser.c b/mail/e-mail-browser.c
+index e237d51..ca582cc 100644
+--- a/mail/e-mail-browser.c
++++ b/mail/e-mail-browser.c
+@@ -441,7 +441,8 @@ mail_browser_dispose (GObject *object)
+ }
+
+ if (priv->message_list != NULL) {
+- g_object_unref (priv->message_list);
++ /* This will cancel a regen operation. */
++ gtk_widget_destroy (priv->message_list);
+ priv->message_list = NULL;
+ }
+
+diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
+index 5729486..1293730 100644
+--- a/mail/e-mail-reader.c
++++ b/mail/e-mail-reader.c
+@@ -52,7 +52,8 @@
+ #include "mail/message-list.h"
+
+ #define E_MAIL_READER_GET_PRIVATE(obj) \
+- (mail_reader_get_private (G_OBJECT (obj)))
++ ((EMailReaderPrivate *) g_object_get_qdata \
++ (G_OBJECT (obj), quark_private))
+
+ typedef struct _EMailReaderPrivate EMailReaderPrivate;
+
+@@ -92,31 +93,24 @@ static GQuark quark_private;
+ static guint signals[LAST_SIGNAL];
+
+ static void
+-mail_reader_finalize (EMailReaderPrivate *priv)
++mail_reader_destroy (GObject *object)
+ {
+- if (priv->message_selected_timeout_id > 0)
+- g_source_remove (priv->message_selected_timeout_id);
+-
+- g_free (priv->mark_read_message_uid);
+-
+- g_slice_free (EMailReaderPrivate, priv);
++ /* This will free the private struct. */
++ g_object_set_qdata (object, quark_private, NULL);
+ }
+
+-static EMailReaderPrivate *
+-mail_reader_get_private (GObject *object)
++static void
++mail_reader_private_free (EMailReaderPrivate *priv)
+ {
+- EMailReaderPrivate *priv;
++ if (priv->message_selected_timeout_id > 0)
++ g_source_remove (priv->message_selected_timeout_id);
+
+- priv = g_object_get_qdata (object, quark_private);
++ if (priv->retrieving_message_operation_id > 0)
++ mail_msg_cancel (priv->retrieving_message_operation_id);
+
+- if (G_UNLIKELY (priv == NULL)) {
+- priv = g_slice_new0 (EMailReaderPrivate);
+- g_object_set_qdata_full (
+- object, quark_private, priv,
+- (GDestroyNotify) mail_reader_finalize);
+- }
++ g_free (priv->mark_read_message_uid);
+
+- return priv;
++ g_slice_free (EMailReaderPrivate, priv);
+ }
+
+ static void
+@@ -1811,6 +1805,14 @@ mail_reader_message_loaded_cb (CamelFolder *folder,
+
+ priv = E_MAIL_READER_GET_PRIVATE (reader);
+
++ /* If the private struct is NULL, the EMailReader was destroyed
++ * while we were loading the message and we're likely holding the
++ * last reference. Nothing to do but drop the reference. */
++ if (priv == NULL) {
++ g_object_unref (reader);
++ return;
++ }
++
+ html_display = e_mail_reader_get_html_display (reader);
+ message_list = e_mail_reader_get_message_list (reader);
+
+@@ -2540,7 +2542,7 @@ e_mail_reader_get_type (void)
+ type = g_type_register_static (
+ G_TYPE_INTERFACE, "EMailReader", &type_info, 0);
+
+- g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
++ g_type_interface_add_prerequisite (type, GTK_TYPE_OBJECT);
+ }
+
+ return type;
+@@ -2689,6 +2691,19 @@ e_mail_reader_init (EMailReader *reader)
+ g_signal_connect_swapped (
+ message_list, "selection-change",
+ G_CALLBACK (e_mail_reader_changed), reader);
++
++ /* Install a private struct for storing things like flags and
++ * timeout and asynchronous operation IDs. We delete it when
++ * the EMailReader is destroyed rather than finalized so that
++ * asynchronous callbacks holding a reference can detect that
++ * the reader has been destroyed and drop their reference. */
++ g_object_set_qdata_full (
++ G_OBJECT (reader), quark_private,
++ g_slice_new0 (EMailReaderPrivate),
++ (GDestroyNotify) mail_reader_private_free);
++ g_signal_connect (
++ reader, "destroy",
++ G_CALLBACK (mail_reader_destroy), NULL);
+ }
+
+ void
+diff --git a/mail/message-list.c b/mail/message-list.c
+index e09ac09..466d4c5 100644
+--- a/mail/message-list.c
++++ b/mail/message-list.c
+@@ -4580,7 +4580,7 @@ mail_regen_list (MessageList *ml, const gchar *search, const gchar *hideexpr, Ca
+ #endif
+
+ m = mail_msg_new (®en_list_info);
+- m->ml = ml;
++ m->ml = g_object_ref (ml);
+ m->search = g_strdup (search);
+ m->hideexpr = g_strdup (hideexpr);
+ m->changes = changes;
+@@ -4588,9 +4588,7 @@ mail_regen_list (MessageList *ml, const gchar *search, const gchar *hideexpr, Ca
+ m->hidedel = ml->hidedeleted;
+ m->hidejunk = ml->hidejunk;
+ m->thread_subject = gconf_client_get_bool (gconf, "/apps/evolution/mail/display/thread_subject", NULL);
+- g_object_ref(ml);
+- m->folder = ml->folder;
+- g_object_ref (m->folder);
++ m->folder = g_object_ref (ml->folder);
+ m->last_row = -1;
+ m->expand_state = NULL;
+
Added: unstable/evolution/debian/patches/04_fix-crash-when-viewing-closing-mails-quickly_2.patch
URL: http://svn.debian.org/wsvn/pkg-evolution/unstable/evolution/debian/patches/04_fix-crash-when-viewing-closing-mails-quickly_2.patch?rev=1648&op=file
==============================================================================
--- unstable/evolution/debian/patches/04_fix-crash-when-viewing-closing-mails-quickly_2.patch (added)
+++ unstable/evolution/debian/patches/04_fix-crash-when-viewing-closing-mails-quickly_2.patch Mon May 24 08:26:34 2010
@@ -1,0 +1,148 @@
+commit 4a2343cb34498c701e71679e3c50c9fc81dd5b80
+Author: Matthew Barnes <mbarnes at redhat.com>
+Date: Tue May 18 08:07:19 2010 -0400
+
+ Bug 618902 - Crash when viewing/closing messages quickly
+
+ Closing an EMailBrowser window causes it to be disposed immediately,
+ but ongoing async operations still hold an EMailBrowser reference --
+ in particular, regenerating the internal message list and fetching a
+ mail message. The callback functions for these operations were not
+ equipped to deal with the disposed-but-not-yet-finalized object.
+
+diff --git a/mail/e-mail-browser.c b/mail/e-mail-browser.c
+index cf5176f..cd7ecd3 100644
+--- a/mail/e-mail-browser.c
++++ b/mail/e-mail-browser.c
+@@ -445,7 +445,8 @@ mail_browser_dispose (GObject *object)
+ }
+
+ if (priv->message_list != NULL) {
+- g_object_unref (priv->message_list);
++ /* This will cancel a regen operation. */
++ gtk_widget_destroy (priv->message_list);
+ priv->message_list = NULL;
+ }
+
+diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
+index 53d45fd..bb668bf 100644
+--- a/mail/e-mail-reader.c
++++ b/mail/e-mail-reader.c
+@@ -52,7 +52,8 @@
+ #include "mail/message-list.h"
+
+ #define E_MAIL_READER_GET_PRIVATE(obj) \
+- (mail_reader_get_private (G_OBJECT (obj)))
++ ((EMailReaderPrivate *) g_object_get_qdata \
++ (G_OBJECT (obj), quark_private))
+
+ typedef struct _EMailReaderPrivate EMailReaderPrivate;
+
+@@ -92,31 +93,24 @@ static GQuark quark_private;
+ static guint signals[LAST_SIGNAL];
+
+ static void
+-mail_reader_finalize (EMailReaderPrivate *priv)
++mail_reader_destroy (GObject *object)
+ {
+- if (priv->message_selected_timeout_id > 0)
+- g_source_remove (priv->message_selected_timeout_id);
+-
+- g_free (priv->mark_read_message_uid);
+-
+- g_slice_free (EMailReaderPrivate, priv);
++ /* This will free the private struct. */
++ g_object_set_qdata (object, quark_private, NULL);
+ }
+
+-static EMailReaderPrivate *
+-mail_reader_get_private (GObject *object)
++static void
++mail_reader_private_free (EMailReaderPrivate *priv)
+ {
+- EMailReaderPrivate *priv;
++ if (priv->message_selected_timeout_id > 0)
++ g_source_remove (priv->message_selected_timeout_id);
+
+- priv = g_object_get_qdata (object, quark_private);
++ if (priv->retrieving_message_operation_id > 0)
++ mail_msg_cancel (priv->retrieving_message_operation_id);
+
+- if (G_UNLIKELY (priv == NULL)) {
+- priv = g_slice_new0 (EMailReaderPrivate);
+- g_object_set_qdata_full (
+- object, quark_private, priv,
+- (GDestroyNotify) mail_reader_finalize);
+- }
++ g_free (priv->mark_read_message_uid);
+
+- return priv;
++ g_slice_free (EMailReaderPrivate, priv);
+ }
+
+ static void
+@@ -1830,6 +1824,14 @@ mail_reader_message_loaded_cb (CamelFolder *folder,
+
+ priv = E_MAIL_READER_GET_PRIVATE (reader);
+
++ /* If the private struct is NULL, the EMailReader was destroyed
++ * while we were loading the message and we're likely holding the
++ * last reference. Nothing to do but drop the reference. */
++ if (priv == NULL) {
++ g_object_unref (reader);
++ return;
++ }
++
+ html_display = e_mail_reader_get_html_display (reader);
+ message_list = e_mail_reader_get_message_list (reader);
+
+@@ -2551,7 +2553,7 @@ e_mail_reader_get_type (void)
+ type = g_type_register_static (
+ G_TYPE_INTERFACE, "EMailReader", &type_info, 0);
+
+- g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
++ g_type_interface_add_prerequisite (type, GTK_TYPE_OBJECT);
+ }
+
+ return type;
+@@ -2726,6 +2728,19 @@ e_mail_reader_init (EMailReader *reader)
+ g_signal_connect_swapped (
+ message_list, "selection-change",
+ G_CALLBACK (e_mail_reader_changed), reader);
++
++ /* Install a private struct for storing things like flags and
++ * timeout and asynchronous operation IDs. We delete it when
++ * the EMailReader is destroyed rather than finalized so that
++ * asynchronous callbacks holding a reference can detect that
++ * the reader has been destroyed and drop their reference. */
++ g_object_set_qdata_full (
++ G_OBJECT (reader), quark_private,
++ g_slice_new0 (EMailReaderPrivate),
++ (GDestroyNotify) mail_reader_private_free);
++ g_signal_connect (
++ reader, "destroy",
++ G_CALLBACK (mail_reader_destroy), NULL);
+ }
+
+ void
+diff --git a/mail/message-list.c b/mail/message-list.c
+index ed12365..c736108 100644
+--- a/mail/message-list.c
++++ b/mail/message-list.c
+@@ -4900,7 +4900,7 @@ mail_regen_list (MessageList *ml, const gchar *search, const gchar *hideexpr, Ca
+ #endif
+
+ m = mail_msg_new (®en_list_info);
+- m->ml = ml;
++ m->ml = g_object_ref (ml);
+ m->search = g_strdup (search);
+ m->hideexpr = g_strdup (hideexpr);
+ m->changes = changes;
+@@ -4908,7 +4908,6 @@ mail_regen_list (MessageList *ml, const gchar *search, const gchar *hideexpr, Ca
+ m->hidedel = ml->hidedeleted;
+ m->hidejunk = ml->hidejunk;
+ m->thread_subject = gconf_client_get_bool (gconf, "/apps/evolution/mail/display/thread_subject", NULL);
+- g_object_ref(ml);
+ m->folder = ml->folder;
+ camel_object_ref(m->folder);
+ m->last_row = -1;
More information about the pkg-evolution-commits
mailing list