Ref the passed in socket in g_socket_listener_add_socket (#585599)
authorAlexander Larsson <alexl@redhat.com>
Mon, 15 Jun 2009 13:42:38 +0000 (15:42 +0200)
committerAlexander Larsson <alexl@redhat.com>
Mon, 15 Jun 2009 13:42:38 +0000 (15:42 +0200)
gio/gsocketlistener.c

index 522ed44..d0025f5 100644 (file)
@@ -234,6 +234,7 @@ g_socket_listener_add_socket (GSocketListener  *listener,
       return FALSE;
     }
 
+  g_object_ref (socket);
   g_ptr_array_add (listener->priv->sockets, socket);
 
   if (source_object)
@@ -301,15 +302,13 @@ g_socket_listener_add_address (GSocketListener  *listener,
   g_socket_set_listen_backlog (socket, listener->priv->listen_backlog);
 
   if (!g_socket_bind (socket, address, TRUE, error) ||
-      !g_socket_listen (socket, error) ||
-      !g_socket_listener_add_socket (listener, socket,
-                                    source_object,
-                                    error))
+      !g_socket_listen (socket, error))
     {
       g_object_unref (socket);
       return FALSE;
     }
 
+  local_address = NULL;
   if (effective_address)
     {
       local_address = g_socket_get_local_address (socket, error);
@@ -318,9 +317,23 @@ g_socket_listener_add_address (GSocketListener  *listener,
          g_object_unref (socket);
          return FALSE;
        }
-      *effective_address = local_address;
     }
 
+  if (!g_socket_listener_add_socket (listener, socket,
+                                    source_object,
+                                    error))
+    {
+      if (local_address)
+       g_object_unref (local_address);
+      g_object_unref (socket);
+      return FALSE;
+    }
+
+  if (effective_address)
+    *effective_address = local_address;
+
+  g_object_unref (socket); /* add_socket refs this */
+
   if (G_SOCKET_LISTENER_GET_CLASS (listener)->changed)
     G_SOCKET_LISTENER_GET_CLASS (listener)->changed (listener);