[gnome-software/gnome-3-14] Fix a crash in the screenshot loader



commit a4a2586d874f815970df127be259c9ffbda49fa8
Author: Kalev Lember <kalevlember gmail com>
Date:   Mon Dec 29 13:28:35 2014 +0100

    Fix a crash in the screenshot loader
    
    We were crashing if the screenshot image was destroyed while we were
    still waiting on the soup network request. When the callback arrived,
    we'd already cleared all the private data and didn't handle that case
    properly.
    
    Fix this by explicitly cancelling the soup message in the teardown code
    and handle SOUP_STATUS_CANCELLED in the callback to make sure we return
    early in that case.
    
    Should fix https://bugzilla.redhat.com/show_bug.cgi?id=1137027 which is
    high up in the Fedora 21 crasher list.

 src/gs-screenshot-image.c |   27 +++++++++++++++++++++++----
 1 files changed, 23 insertions(+), 4 deletions(-)
---
diff --git a/src/gs-screenshot-image.c b/src/gs-screenshot-image.c
index bd81053..383656d 100644
--- a/src/gs-screenshot-image.c
+++ b/src/gs-screenshot-image.c
@@ -41,6 +41,7 @@ struct _GsScreenshotImagePrivate
        GtkWidget       *image2;
        GtkWidget       *label_error;
        SoupSession     *session;
+       SoupMessage     *message;
        gchar           *cachedir;
        gchar           *filename;
        const gchar     *current_image;
@@ -208,6 +209,9 @@ gs_screenshot_image_complete_cb (SoupSession *session,
        GInputStream *stream = NULL;
        gboolean ret;
 
+       if (msg->status_code == SOUP_STATUS_CANCELLED)
+               goto out;
+
        if (msg->status_code != SOUP_STATUS_OK) {
                /* TRANSLATORS: this is when we try to download a screenshot and
                 * we get back 404 */
@@ -334,7 +338,6 @@ gs_screenshot_image_load_async (GsScreenshotImage *ssimg,
 {
        AsImage *im = NULL;
        GsScreenshotImagePrivate *priv;
-       SoupMessage *msg = NULL;
        SoupURI *base_uri = NULL;
        const gchar *url;
        gchar *basename = NULL;
@@ -408,15 +411,25 @@ gs_screenshot_image_load_async (GsScreenshotImage *ssimg,
                gs_screenshot_image_set_error (ssimg, _("Screenshot not valid"));
                goto out;
        }
-       msg = soup_message_new_from_uri (SOUP_METHOD_GET, base_uri);
-       if (msg == NULL) {
+
+       /* cancel any previous messages */
+       if (priv->message != NULL) {
+               soup_session_cancel_message (priv->session,
+                                            priv->message,
+                                            SOUP_STATUS_CANCELLED);
+               g_clear_object (&priv->message);
+       }
+
+       priv->message = soup_message_new_from_uri (SOUP_METHOD_GET, base_uri);
+       if (priv->message == NULL) {
                /* TRANSLATORS: this is when networking is not available */
                gs_screenshot_image_set_error (ssimg, _("Screenshot not available"));
                goto out;
        }
 
        /* send async */
-       soup_session_queue_message (priv->session, msg,
+       soup_session_queue_message (priv->session,
+                                   g_object_ref (priv->message) /* transfer full */,
                                    gs_screenshot_image_complete_cb,
                                    g_object_ref (ssimg));
 out:
@@ -438,6 +451,12 @@ gs_screenshot_image_destroy (GtkWidget *widget)
 
        priv = gs_screenshot_image_get_instance_private (ssimg);
 
+       if (priv->message != NULL) {
+               soup_session_cancel_message (priv->session,
+                                            priv->message,
+                                            SOUP_STATUS_CANCELLED);
+               g_clear_object (&priv->message);
+       }
        g_clear_object (&priv->screenshot);
        g_free (priv->cachedir);
        priv->cachedir = NULL;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]