From 48c670ca6dbe5a3e8568076780c27158aa5b6f72 Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Fri, 20 Oct 2006 01:56:12 +0000 Subject: [PATCH] Fixed leaks when a connection was closed When one side of the connection was closed, the other side would still be connected and no memory would be released. To avoid loops, deadlocks or leaks, the peer reference should be to the hook and not to the connection/socket only. --- jabber.c | 20 ++++++++++++++------ jabber_server.c | 16 ++++++++++++---- nethook.h | 2 +- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/jabber.c b/jabber.c index ebd7627..6daac0d 100644 --- a/jabber.c +++ b/jabber.c @@ -29,6 +29,14 @@ static void jabber_connect (net_hook_t* hook) static void jabber_close (net_hook_t* hook) { + if (hook->peer) + { + hook->peer->peer = NULL; + gnet_conn_disconnect (hook->peer->conn); + } + gnet_conn_delete (hook->conn); + iks_parser_delete (hook->data); + g_slice_free (net_hook_t, hook); } static void jabber_write (net_hook_t* hook) @@ -63,13 +71,13 @@ void jabber_connect_server (net_hook_t* hook, char* server, iks* node) if (hook->peer == NULL) { server_hook = jabber_server_hook_new (hook, server); - hook->peer = server_hook->conn; + hook->peer = server_hook; g_message ("Trying to connect to server %s.", server); - gnet_conn_connect (hook->peer); - gnet_conn_read (hook->peer); + gnet_conn_connect (hook->peer->conn); + gnet_conn_read (hook->peer->conn); } buffer = jabber_new_start (node); - gnet_conn_write (hook->peer, buffer->str, buffer->len); + gnet_conn_write (hook->peer->conn, buffer->str, buffer->len); g_string_free (buffer, TRUE); } @@ -77,7 +85,7 @@ void jabber_send (net_hook_t* hook, iks* node) { GString* buffer; buffer = g_string_new (iks_string (iks_stack (node), node)); - gnet_conn_write (hook->peer, buffer->str, buffer->len); + gnet_conn_write (hook->peer->conn, buffer->str, buffer->len); g_string_free (buffer, TRUE); } @@ -102,7 +110,7 @@ int jabber_parser (gpointer data, int type, iks* node) iks_delete (node); break; case IKS_NODE_STOP: - gnet_conn_write (hook->peer, "", 16); + gnet_conn_write (hook->peer->conn, "", 16); break; case IKS_NODE_ERROR: break; diff --git a/jabber_server.c b/jabber_server.c index 4528de9..9955f09 100644 --- a/jabber_server.c +++ b/jabber_server.c @@ -30,6 +30,14 @@ static void jabber_server_connect (net_hook_t* hook) static void jabber_server_close (net_hook_t* hook) { + if (hook->peer) + { + hook->peer->peer = NULL; + gnet_conn_disconnect (hook->peer->conn); + } + gnet_conn_delete (hook->conn); + iks_parser_delete (hook->data); + g_slice_free (net_hook_t, hook); g_message ("Server disconnected."); } @@ -51,18 +59,18 @@ int jabber_server_parser (gpointer data, int type, iks* node) { case IKS_NODE_START: buffer = jabber_new_start (node); - gnet_conn_write (hook->peer, buffer->str, buffer->len); + gnet_conn_write (hook->peer->conn, buffer->str, buffer->len); g_string_free (buffer, TRUE); iks_delete (node); break; case IKS_NODE_NORMAL: buffer = g_string_new (iks_string (iks_stack (node), node)); - gnet_conn_write (hook->peer, buffer->str, buffer->len); + gnet_conn_write (hook->peer->conn, buffer->str, buffer->len); g_string_free (buffer, TRUE); iks_delete (node); break; case IKS_NODE_STOP: - gnet_conn_write (hook->peer, "", 16); + gnet_conn_write (hook->peer->conn, "", 16); break; case IKS_NODE_ERROR: g_debug ("Parse error!!"); @@ -76,7 +84,7 @@ net_hook_t* jabber_server_hook_new (net_hook_t* client_hook, char* server) net_hook_t* hook; hook = g_slice_new (net_hook_t); hook->conn = gnet_conn_new (server, 5222, nethook_event, hook); - hook->peer = client_hook->conn; + hook->peer = client_hook; hook->server = TRUE; hook->connect = jabber_server_connect; hook->close = jabber_server_close; diff --git a/nethook.h b/nethook.h index ed73e6c..ec1a60f 100644 --- a/nethook.h +++ b/nethook.h @@ -31,7 +31,7 @@ typedef void (*net_read) (net_hook_t*, gchar*, size_t); struct _net_hook_t { GConn* conn; - GConn* peer; + net_hook_t* peer; gboolean server; net_connect connect; net_close close; -- 2.20.1