sslconn: Clean up tls_connect() function error paths purple-ssl-to-gio

Thu, 07 Apr 2016 02:45:41 -0500

author
Mike Ruprecht <cmaiku@gmail.com>
date
Thu, 07 Apr 2016 02:45:41 -0500
branch
purple-ssl-to-gio
changeset 37634
ee6f9faeee6f
parent 37633
323b1884d008
child 37635
e6ccacaa6322

sslconn: Clean up tls_connect() function error paths

This patch modifies sslconn's tls_connect() function to return a
boolean based on whether or not the function succeeded. This makes
it so that if the GTlsBackend doesn't support TLS or some other
error occurs, purple_ssl_connect_with_fd() can return NULL
preserving previous behavior without relying on the
_ssl_initialized variable.

libpurple/sslconn.c file | annotate | diff | comparison | revisions
--- a/libpurple/sslconn.c	Thu Apr 07 01:27:18 2016 -0500
+++ b/libpurple/sslconn.c	Thu Apr 07 02:45:41 2016 -0500
@@ -70,7 +70,7 @@
 	gsc->connect_cb(gsc->connect_cb_data, gsc, PURPLE_INPUT_READ);
 }
 
-static void
+static gboolean
 tls_connect(PurpleSslConnection *gsc)
 {
 	GSocket *socket;
@@ -79,13 +79,15 @@
 	GIOStream *tls_conn;
 	GError *error = NULL;
 
-	g_return_if_fail(gsc->conn == NULL);
+	g_return_val_if_fail(gsc->conn == NULL, FALSE);
 
 	socket = g_socket_new_from_fd(gsc->fd, &error);
 	if (socket == NULL) {
-		emit_error(gsc, PURPLE_SSL_CONNECT_FAILED);
-		purple_ssl_close(gsc);
-		return;
+		purple_debug_warning("sslconn",
+				"Error creating socket from fd (%u): %s",
+				gsc->fd, error->message);
+		g_clear_error(&error);
+		return FALSE;
 	}
 
 	conn = g_socket_connection_factory_create_connection(socket);
@@ -98,9 +100,11 @@
 	g_object_unref(conn);
 
 	if (tls_conn == NULL) {
-		emit_error(gsc, PURPLE_SSL_CONNECT_FAILED);
-		purple_ssl_close(gsc);
-		return;
+		purple_debug_warning("sslconn",
+				"Error creating TLS client connection: %s",
+				error->message);
+		g_clear_error(&error);
+		return FALSE;
 	}
 
 	gsc->conn = G_TLS_CONNECTION(tls_conn);
@@ -110,6 +114,8 @@
 
 	g_tls_connection_handshake_async(gsc->conn, G_PRIORITY_DEFAULT,
 			gsc->cancellable, tls_handshake_cb, gsc);
+
+	return TRUE;
 }
 
 static void
@@ -129,7 +135,10 @@
 
 	gsc->fd = source;
 
-	tls_connect(gsc);
+	if (!tls_connect(gsc)) {
+		emit_error(gsc, PURPLE_SSL_CONNECT_FAILED);
+		purple_ssl_close(gsc);
+	}
 }
 
 PurpleSslConnection *
@@ -267,7 +276,10 @@
         gsc->host            = g_strdup(host);
 	gsc->cancellable     = g_cancellable_new();
 
-	tls_connect(gsc);
+	if (!tls_connect(gsc)) {
+		emit_error(gsc, PURPLE_SSL_CONNECT_FAILED);
+		g_clear_pointer(&gsc, purple_ssl_close);
+	}
 
 	return (PurpleSslConnection *)gsc;
 }

mercurial