valgrindage
authorDan Winship <danw@gnome.org>
Sun, 12 Aug 2012 00:03:44 +0000 (20:03 -0400)
committerDan Winship <danw@gnome.org>
Sun, 12 Aug 2012 00:03:44 +0000 (20:03 -0400)
15 files changed:
libsoup/soup-client-input-stream.c
libsoup/soup-converter-wrapper.c
libsoup/soup-io-stream.c
libsoup/soup-message-io.c
libsoup/soup-request-http.c
libsoup/soup-session-async.c
libsoup/soup-socket.c
libsoup/soup-tld.c
tests/coding-test.c
tests/connection-test.c
tests/libsoup.supp
tests/proxy-test.c
tests/redirect-test.c
tests/requester-test.c
tests/timeout-test.c

index 5c18eaa..966b940 100644 (file)
@@ -47,6 +47,16 @@ soup_client_input_stream_init (SoupClientInputStream *stream)
 }
 
 static void
+soup_client_input_stream_finalize (GObject *object)
+{
+       SoupClientInputStream *cistream = SOUP_CLIENT_INPUT_STREAM (object);
+
+       g_clear_object (&cistream->priv->msg);
+
+       G_OBJECT_CLASS (soup_client_input_stream_parent_class)->finalize (object);
+}
+
+static void
 soup_client_input_stream_set_property (GObject *object, guint prop_id,
                                       const GValue *value, GParamSpec *pspec)
 {
@@ -231,6 +241,7 @@ soup_client_input_stream_class_init (SoupClientInputStreamClass *stream_class)
 
        g_type_class_add_private (stream_class, sizeof (SoupClientInputStreamPrivate));
 
+       object_class->finalize = soup_client_input_stream_finalize;
        object_class->set_property = soup_client_input_stream_set_property;
        object_class->get_property = soup_client_input_stream_get_property;
 
index 1953229..6fa19d9 100644 (file)
@@ -50,11 +50,20 @@ struct _SoupConverterWrapperPrivate
 };
 
 static void
+soup_converter_wrapper_init (SoupConverterWrapper *converter)
+{
+       converter->priv = G_TYPE_INSTANCE_GET_PRIVATE (converter,
+                                                      SOUP_TYPE_CONVERTER_WRAPPER,
+                                                      SoupConverterWrapperPrivate);
+}
+
+static void
 soup_converter_wrapper_finalize (GObject *object)
 {
        SoupConverterWrapperPrivate *priv = SOUP_CONVERTER_WRAPPER (object)->priv;
 
        g_clear_object (&priv->base_converter);
+       g_clear_object (&priv->msg);
 
        G_OBJECT_CLASS (soup_converter_wrapper_parent_class)->finalize (object);
 }
@@ -116,14 +125,6 @@ soup_converter_wrapper_get_property (GObject    *object,
 }
 
 static void
-soup_converter_wrapper_init (SoupConverterWrapper *converter)
-{
-       converter->priv = G_TYPE_INSTANCE_GET_PRIVATE (converter,
-                                                      SOUP_TYPE_CONVERTER_WRAPPER,
-                                                      SoupConverterWrapperPrivate);
-}
-
-static void
 soup_converter_wrapper_class_init (SoupConverterWrapperClass *klass)
 {
        GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
index 74c7158..ea5ddef 100644 (file)
@@ -103,6 +103,8 @@ soup_io_stream_finalize (GObject *object)
        SoupIOStream *siostream = SOUP_IO_STREAM (object);
 
        g_clear_object (&siostream->priv->base_iostream);
+       g_clear_object (&siostream->priv->istream);
+       g_clear_object (&siostream->priv->ostream);
 
        G_OBJECT_CLASS (soup_io_stream_parent_class)->finalize (object);
 }
index eeb6755..6924e20 100644 (file)
@@ -243,6 +243,7 @@ setup_body_istream (SoupMessage *msg)
                                       "converter", wrapper,
                                       NULL);
                g_object_unref (io->body_istream);
+               g_object_unref (wrapper);
                io->body_istream = filter;
        }
 
@@ -908,7 +909,8 @@ io_run (SoupMessage *msg, gpointer user_data)
 
                g_error_free (error);
                soup_message_io_finished (msg);
-       }
+       } else if (error)
+               g_error_free (error);
 
        g_object_unref (msg);
        g_clear_object (&cancellable);
@@ -946,8 +948,10 @@ soup_message_io_run_until_finish (SoupMessage   *msg,
        if (!io_run_until (msg,
                           SOUP_MESSAGE_IO_STATE_DONE,
                           SOUP_MESSAGE_IO_STATE_DONE,
-                          cancellable, error))
+                          cancellable, error)) {
+               g_object_unref (msg);
                return FALSE;
+       }
 
        soup_message_io_finished (msg);
        g_object_unref (msg);
index 44a1f7d..4fc8220 100644 (file)
@@ -113,12 +113,9 @@ free_send_async_data (SendAsyncData *sadata)
        g_object_unref (sadata->http);
        g_object_unref (sadata->simple);
 
-       if (sadata->cancellable)
-               g_object_unref (sadata->cancellable);
-       if (sadata->stream)
-               g_object_unref (sadata->stream);
-       if (sadata->original)
-               g_object_unref (sadata->original);
+       g_clear_object (&sadata->cancellable);
+       g_clear_object (&sadata->stream);
+       g_clear_object (&sadata->original);
 
        g_slice_free (SendAsyncData, sadata);
 }
index 81afcf8..75929ed 100644 (file)
@@ -543,7 +543,7 @@ send_request_finished (SoupSession *session, SoupMessageQueueItem *item)
                return;
        }
 
-       mostream = g_object_get_data (G_OBJECT (item->msg), "SoupSessionAsync:ostream");
+       mostream = g_object_get_data (G_OBJECT (item->result), "SoupSessionAsync:ostream");
        if (mostream) {
                gpointer data;
                gssize size;
@@ -576,9 +576,14 @@ send_async_spliced (GObject *source, GAsyncResult *result, gpointer user_data)
 {
        SoupMessageQueueItem *item = user_data;
        GInputStream *istream = g_object_get_data (source, "istream");
-
        GError *error = NULL;
 
+       /* It should be safe to call the sync close() method here since
+        * the message body has already been written.
+        */
+       g_input_stream_close (istream, NULL, NULL);
+       g_object_unref (istream);
+
        /* If the message was cancelled, it will be completed via other means */
        if (g_cancellable_is_cancelled (item->cancellable) ||
            !item->result) {
@@ -589,14 +594,11 @@ send_async_spliced (GObject *source, GAsyncResult *result, gpointer user_data)
        if (g_output_stream_splice_finish (G_OUTPUT_STREAM (source),
                                           result, &error) == -1) {
                send_request_return_result (item, NULL, error);
+               soup_message_queue_item_unref (item);
                return;
        }
 
-       /* Otherwise either restarted or finished will eventually be called.
-        * It should be safe to call the sync close() method here since
-        * the message body has already been written.
-        */
-       g_input_stream_close (istream, NULL, NULL);
+       /* Otherwise either restarted or finished will eventually be called. */
        do_idle_run_queue (item->session);
        soup_message_queue_item_unref (item);
 }
@@ -612,11 +614,10 @@ send_async_maybe_complete (SoupMessageQueueItem *item,
 
                /* Message may be requeued, so gather the current message body... */
                ostream = g_memory_output_stream_new (NULL, 0, g_realloc, g_free);
-               g_object_set_data_full (G_OBJECT (item->msg), "SoupSessionAsync:ostream",
+               g_object_set_data_full (G_OBJECT (item->result), "SoupSessionAsync:ostream",
                                        ostream, g_object_unref);
 
-               g_object_set_data_full (G_OBJECT (ostream), "istream",
-                                       stream, g_object_unref);
+               g_object_set_data (G_OBJECT (ostream), "istream", stream);
 
                /* Give the splice op its own ref on item */
                soup_message_queue_item_ref (item);
index c789e64..f44cf34 100644 (file)
@@ -674,8 +674,10 @@ socket_connected (SoupSocket *sock, GSocketConnection *conn, GError *error)
 
                g_object_unref (priv->connect_cancel);
                priv->connect_cancel = NULL;
-               if (cancelled)
+               if (cancelled) {
+                       g_clear_error (&error);
                        return SOUP_STATUS_CANCELLED;
+               }
        }
 
        if (error) {
index fc7c992..8782a82 100644 (file)
@@ -110,8 +110,10 @@ soup_tld_domain_is_public_suffix (const char *domain)
                g_return_val_if_reached (FALSE);
 
        base_domain = soup_tld_get_base_domain_internal (domain, 0, &error);
-       if (g_strcmp0 (domain, base_domain))
+       if (g_strcmp0 (domain, base_domain)) {
+               g_clear_error (&error);
                return FALSE;
+       }
 
        if (g_error_matches (error, SOUP_TLD_ERROR, SOUP_TLD_ERROR_NO_BASE_DOMAIN)) {
                g_error_free (error);
index 02ec23a..cd7321e 100644 (file)
@@ -109,7 +109,8 @@ server_callback (SoupServer *server, SoupMessage *msg,
        if (!soup_header_contains (options, "empty")) {
                soup_message_body_append (msg->response_body,
                                          SOUP_MEMORY_TAKE, contents, length);
-       }
+       } else
+               g_free (contents);
 
        if (soup_header_contains (options, "trailing-junk")) {
                soup_message_body_append (msg->response_body, SOUP_MEMORY_COPY,
@@ -366,6 +367,7 @@ do_single_coding_req_test (SoupRequest *req,
                g_error_free (error);
                errors++;
        }
+       g_object_unref (stream);
 
        check_response (msg, expected_encoding, expected_content_type, status);
        g_object_unref (msg);
@@ -434,6 +436,7 @@ do_coding_req_test (void)
        cmp = do_single_coding_req_test (req, "gzip", "text/plain", EXPECT_DECODED);
        check_req_bodies (plain, cmp, "plain", "compressed w/ junk");
        g_byte_array_free (cmp, TRUE);
+       g_object_unref (msg);
        g_object_unref (req);
 
        /* Plain text data, claim gzip with server error */
@@ -450,6 +453,7 @@ do_coding_req_test (void)
         */
        check_req_bodies (plain, cmp, "plain", "mis-encoded");
        g_byte_array_free (cmp, TRUE);
+       g_object_unref (msg);
        g_object_unref (req);
 
        /* Plain text data, claim deflate */
@@ -461,6 +465,7 @@ do_coding_req_test (void)
        cmp = do_single_coding_req_test (req, "deflate", "text/plain", EXPECT_DECODED);
        check_req_bodies (plain, cmp, "plain", "compressed");
        g_byte_array_free (cmp, TRUE);
+       g_object_unref (msg);
        g_object_unref (req);
 
        /* Plain text data, claim deflate w/ junk */
@@ -472,6 +477,7 @@ do_coding_req_test (void)
        cmp = do_single_coding_req_test (req, "deflate", "text/plain", EXPECT_DECODED);
        check_req_bodies (plain, cmp, "plain", "compressed w/ junk");
        g_byte_array_free (cmp, TRUE);
+       g_object_unref (msg);
        g_object_unref (req);
 
        /* Plain text data, claim deflate with server error */
@@ -483,6 +489,7 @@ do_coding_req_test (void)
        cmp = do_single_coding_req_test (req, "deflate", "text/plain", EXPECT_NOT_DECODED);
        check_req_bodies (plain, cmp, "plain", "mis-encoded");
        g_byte_array_free (cmp, TRUE);
+       g_object_unref (msg);
        g_object_unref (req);
 
        /* Plain text data, claim deflate (no zlib headers)*/
@@ -494,6 +501,7 @@ do_coding_req_test (void)
        cmp = do_single_coding_req_test (req, "deflate", "text/plain", EXPECT_DECODED);
        check_req_bodies (plain, cmp, "plain", "compressed");
        g_byte_array_free (cmp, TRUE);
+       g_object_unref (msg);
        g_object_unref (req);
 
        /* Plain text data, claim deflate with server error */
@@ -505,6 +513,7 @@ do_coding_req_test (void)
        cmp = do_single_coding_req_test (req, "deflate", "text/plain", EXPECT_NOT_DECODED);
        check_req_bodies (plain, cmp, "plain", "mis-encoded");
        g_byte_array_free (cmp, TRUE);
+       g_object_unref (msg);
        g_object_unref (req);
 
        g_byte_array_free (plain, TRUE);
@@ -551,6 +560,7 @@ do_coding_empty_test (void)
        g_byte_array_free (body, TRUE);
        g_object_unref (req);
 
+       soup_uri_free (uri);
        soup_test_session_abort_unref (session);
 }
 
index 6ddc89c..f8ff7c1 100644 (file)
@@ -335,6 +335,7 @@ do_timeout_req_test_for_session (SoupSession *session)
                        errors++;
                        g_clear_error (&error);
                }
+               g_object_unref (stream);
        }
 
        if (sockets[1]) {
@@ -361,6 +362,7 @@ do_timeout_req_test_for_session (SoupSession *session)
                        errors++;
                        g_clear_error (&error);
                }
+               g_object_unref (stream);
        }
 
        msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (req));
@@ -582,6 +584,7 @@ do_non_persistent_test_for_session (SoupSession *session)
        g_object_ref (msg);
        soup_session_queue_message (session, msg, NULL, NULL);
        g_main_loop_run (loop);
+       g_main_loop_unref (loop);
 
        if (msg->status_code != SOUP_STATUS_OK) {
                debug_printf (1, "      Unexpected response: %d %s\n",
@@ -589,6 +592,7 @@ do_non_persistent_test_for_session (SoupSession *session)
                errors++;
        }
        g_object_unref (msg);
+       g_object_unref (socket);
 }
 
 static void
index 24c6516..ac21e96 100644 (file)
    ...
    fun:_dl_allocate_tls
    ...
-   fun:g_thread_create_posix_impl
+   fun:g_system_thread_new
 }
 {
    glib/filenamecharsets
    fun:g_tls_backend_gnutls_store_session
 }
 {
+   glib/gtlssessioncache_client
+   Memcheck:Leak
+   ...
+   fun:gnutls_session_get_data2
+   fun:g_tls_client_connection_gnutls_finish_handshake
+}
+{
+   glib/gtlssessioncache_client2
+   Memcheck:Leak
+   ...
+   fun:g_bytes_new_with_free_func
+   fun:g_tls_client_connection_gnutls_finish_handshake
+}
+{
+   glib/gtlssessioncache_client3
+   Memcheck:Leak
+   ...
+   fun:g_bytes_new_take
+   fun:g_tls_client_connection_gnutls_constructed
+}
+{
+   glib/gtlssessioncache_client4
+   Memcheck:Leak
+   ...
+   fun:g_strdup_printf
+   fun:g_tls_client_connection_gnutls_constructed
+}
+{
+   glib/gtlssessioncache_server
+   Memcheck:Leak
+   ...
+   fun:g_tls_server_connection_gnutls_db_store
+}
+{
    glib/cached_poll_array
    Memcheck:Leak
    ...
    fun:g_malloc_n
    fun:g_main_context_iterate
 }
+{
+   glib/rand
+   Memcheck:Leak
+   ...
+   fun:g_rand_new
+   fun:g_random_int_range
+}
+{
+   glib/g_cancellable_push_current
+   Memcheck:Leak
+   ...
+   fun:g_cancellable_push_current
+}
+{
+   glib/slice_thread_local
+   Memcheck:Leak
+   ...
+   fun:thread_memory_from_self
+}
 
 # probably inlines the aggressive memcpy/memcmp
 {
    ...
    fun:intern_header_name
 }
+{
+   libsoup/tlds
+   Memcheck:Leak
+   ...
+   fun:soup_tld_ensure_rules_hash_table
+}
 
 
 # fixme?
index ee0197a..94e548a 100644 (file)
@@ -183,6 +183,7 @@ test_url_new_api (const char *url, int proxy, guint expected,
                        errors++;
                        g_clear_error (&error);
                }
+               g_object_unref (stream);
        }
 
        debug_printf (1, "  %d %s\n", msg->status_code, msg->reason_phrase);
@@ -244,6 +245,7 @@ async_proxy_test_thread (gpointer num)
        g_main_context_push_thread_default (context);
        run_test (GPOINTER_TO_INT (num), FALSE);
        g_main_context_pop_thread_default (context);
+       g_main_context_unref (context);
 
        return NULL;
 }
index 401eda2..3708d86 100644 (file)
@@ -273,6 +273,7 @@ do_request_api_test (SoupSession *session, SoupURI *base_uri, int n)
                }
 
                g_error_free (error);
+               g_object_unref (msg);
                g_object_unref (req);
                debug_printf (2, "\n");
                return;
@@ -280,6 +281,7 @@ do_request_api_test (SoupSession *session, SoupURI *base_uri, int n)
                debug_printf (1, "    could not send request: %s\n",
                              error->message);
                g_error_free (error);
+               g_object_unref (msg);
                g_object_unref (req);
                errors++;
                debug_printf (2, "\n");
@@ -293,6 +295,7 @@ do_request_api_test (SoupSession *session, SoupURI *base_uri, int n)
                g_error_free (error);
                errors++;
        }
+       g_object_unref (stream);
 
        if (msg->status_code != final_status) {
                debug_printf (1, "    - Expected final status of %d, got %d !\n",
@@ -300,6 +303,7 @@ do_request_api_test (SoupSession *session, SoupURI *base_uri, int n)
                errors++;
        }
 
+       g_object_unref (msg);
        g_object_unref (req);
        debug_printf (2, "\n");
 }
index b4e86ea..bc45e9f 100644 (file)
@@ -151,6 +151,7 @@ auth_test_sent (GObject *source, GAsyncResult *res, gpointer user_data)
        stream = soup_request_send_finish (SOUP_REQUEST (source), res, &error);
        if (!stream) {
                debug_printf (1, "    send_async failed: %s\n", error->message);
+               g_clear_error (&error);
                errors++;
                g_main_loop_quit (loop);
                return;
@@ -196,8 +197,8 @@ test_sent (GObject *source, GAsyncResult *res, gpointer user_data)
                } else if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
                        debug_printf (1, "    send_async failed with wrong error: %s\n", error->message);
                        errors++;
-                       g_clear_error (&error);
                }
+               g_clear_error (&error);
                g_main_loop_quit (loop);
                return;
        } else {
@@ -234,6 +235,7 @@ request_started (SoupSession *session, SoupMessage *msg,
 {
        SoupSocket **save_socket = user_data;
 
+       g_clear_object (save_socket);
        *save_socket = g_object_ref (socket);
 }
 
@@ -280,6 +282,7 @@ do_async_test (SoupSession *session, SoupURI *uri,
                              msg->status_code, msg->reason_phrase,
                              expected_status);
                g_object_unref (msg);
+               g_object_unref (socket);
                errors++;
                return;
        }
@@ -459,15 +462,17 @@ do_sync_request (SoupSession *session, SoupRequest *request,
                } else if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
                        debug_printf (1, "    send failed with wrong error: %s\n", error->message);
                        errors++;
-                       g_clear_error (&error);
                }
+               g_clear_error (&error);
                g_object_unref (msg);
+               g_object_unref (socket);
                return;
        } else if (!in) {
                debug_printf (1, "    soup_request_send failed: %s\n",
                              error->message);
                g_object_unref (msg);
                g_clear_error (&error);
+               g_object_unref (socket);
                errors++;
                return;
        }
@@ -477,6 +482,7 @@ do_sync_request (SoupSession *session, SoupRequest *request,
                              msg->reason_phrase);
                g_object_unref (msg);
                g_object_unref (in);
+               g_object_unref (socket);
                errors++;
                return;
        }
index 5c9d6a8..9d9b2d1 100644 (file)
@@ -152,6 +152,7 @@ do_request_to_session (SoupRequester *requester, const char *uri,
                                      error->message);
                        errors++;
                }
+               g_object_unref (stream);
        }
 
        if (SOUP_STATUS_IS_SUCCESSFUL (msg->status_code) &&