/pidgin/main: c6d4df666069: Merged in xhaakon/pidgin (pull reque...

Gary Kramlich grim at reaperworld.com
Fri May 27 10:43:02 EDT 2016


Changeset: c6d4df666069b70d5c956bef5e0d6ec0ff928671
Author:	 Gary Kramlich <grim at reaperworld.com>
Date:	 2016-05-27 09:42 -0500
Branch:	 default
URL: https://hg.pidgin.im/pidgin/main/rev/c6d4df666069

Description:

Merged in xhaakon/pidgin (pull request #54)

sslconn: fix infinite wait in purple_ssl_close()

diffstat:

 libpurple/sslconn.c |  45 +++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 41 insertions(+), 4 deletions(-)

diffs (69 lines):

diff --git a/libpurple/sslconn.c b/libpurple/sslconn.c
--- a/libpurple/sslconn.c
+++ b/libpurple/sslconn.c
@@ -28,6 +28,8 @@
 #include "sslconn.h"
 #include "tls-certificate.h"
 
+#define CONNECTION_CLOSE_TIMEOUT 15
+
 static void
 emit_error(PurpleSslConnection *gsc, int error_code)
 {
@@ -264,6 +266,31 @@ purple_ssl_connect_with_host_fd(PurpleAc
 	return (PurpleSslConnection *)gsc;
 }
 
+static void
+connection_closed_cb(GObject *stream, GAsyncResult *result,
+		gpointer timeout_id)
+{
+	GError *error = NULL;
+
+	purple_timeout_remove(GPOINTER_TO_UINT(timeout_id));
+
+	g_io_stream_close_finish(G_IO_STREAM(stream), result, &error);
+
+	if (error) {
+		purple_debug_info("sslconn", "Connection close error: %s",
+				error->message);
+		g_clear_error(&error);
+	} else {
+		purple_debug_info("sslconn", "Connection closed.");
+	}
+}
+
+static void
+cleanup_cancellable_cb(gpointer data, GObject *where_the_object_was)
+{
+	g_object_unref(G_CANCELLABLE(data));
+}
+
 void
 purple_ssl_close(PurpleSslConnection *gsc)
 {
@@ -285,10 +312,20 @@ purple_ssl_close(PurpleSslConnection *gs
 	}
 
 	if (gsc->conn != NULL) {
-		/* Close the stream. Shouldn't take long and it can't
-		 * be further cancelled so don't pass a cancellable
-		 */
-		g_io_stream_close(G_IO_STREAM(gsc->conn), NULL, NULL);
+		GCancellable *cancellable;
+		guint timer_id;
+
+		cancellable = g_cancellable_new();
+		g_object_weak_ref(G_OBJECT(gsc->conn), cleanup_cancellable_cb,
+				cancellable);
+
+		timer_id = purple_timeout_add_seconds(CONNECTION_CLOSE_TIMEOUT,
+				(GSourceFunc)g_cancellable_cancel, cancellable);
+
+		g_io_stream_close_async(G_IO_STREAM(gsc->conn),
+				G_PRIORITY_DEFAULT, cancellable,
+				connection_closed_cb,
+				GUINT_TO_POINTER(timer_id));
 		g_clear_object(&gsc->conn);
 	}
 



More information about the Commits mailing list