/pidgin/main: ee6f9faeee6f: sslconn: Clean up tls_connect() func...

Mike Ruprecht <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: ee6f9faeee6fa6681b11039b35d2deedcb61c79d
Author:	 Mike Ruprecht <[email protected]>
Date:	 2016-04-07 02:45 -0500
Branch:	 purple-ssl-to-gio
URL: https://hg.pidgin.im/pidgin/main/rev/ee6f9faeee6f

Description:

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.

diffstat:

 libpurple/sslconn.c |  32 ++++++++++++++++++++++----------
 1 files changed, 22 insertions(+), 10 deletions(-)

diffs (80 lines):

diff --git a/libpurple/sslconn.c b/libpurple/sslconn.c
--- a/libpurple/sslconn.c
+++ b/libpurple/sslconn.c
@@ -70,7 +70,7 @@ tls_handshake_cb(GObject *source, GAsync
 	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 @@ tls_connect(PurpleSslConnection *gsc)
 	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 @@ tls_connect(PurpleSslConnection *gsc)
 	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 @@ tls_connect(PurpleSslConnection *gsc)
 
 	g_tls_connection_handshake_async(gsc->conn, G_PRIORITY_DEFAULT,
 			gsc->cancellable, tls_handshake_cb, gsc);
+
+	return TRUE;
 }
 
 static void
@@ -129,7 +135,10 @@ purple_ssl_connect_cb(gpointer data, gin
 
 	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 @@ purple_ssl_connect_with_host_fd(PurpleAc
         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;
 }

_______________________________________________
Commits mailing list
[email protected]
https://pidgin.im/cgi-bin/mailman/listinfo/commits
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.