Fixed leaks when a connection was closed
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Fri, 20 Oct 2006 01:56:12 +0000 (01:56 +0000)
committerThadeu Lima de Souza Cascardo <cascardo@minaslivre.org>
Fri, 20 Oct 2006 01:56:12 +0000 (01:56 +0000)
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
jabber_server.c
nethook.h

index ebd7627..6daac0d 100644 (file)
--- 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, "</stream:stream>", 16);
+      gnet_conn_write (hook->peer->conn, "</stream:stream>", 16);
       break;
     case IKS_NODE_ERROR:
       break;
index 4528de9..9955f09 100644 (file)
@@ -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, "</stream:stream>", 16);
+      gnet_conn_write (hook->peer->conn, "</stream:stream>", 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;
index ed73e6c..ec1a60f 100644 (file)
--- 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;