service: Properly ref/unref the network
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Wed, 18 Jan 2012 14:46:35 +0000 (16:46 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Fri, 20 Jan 2012 00:42:07 +0000 (01:42 +0100)
We only took reference to network when the network was
created by service. This needs to be changed as the network
might disappear while service is using network pointer.
So now we take network ref when necessary and release it
when service is removed or if underlaying network is changed.

src/service.c

index d6c6be0..b8906a6 100644 (file)
@@ -3387,6 +3387,7 @@ static void service_free(gpointer user_data)
        if (service->network != NULL) {
                __connman_network_disconnect(service->network);
                connman_network_unref(service->network);
+               service->network = NULL;
        }
 
        if (service->provider != NULL)
@@ -5160,13 +5161,14 @@ static void update_from_network(struct connman_service *service,
                service->wps = connman_network_get_bool(network, "WiFi.WPS");
 
        if (service->strength > strength && service->network != NULL) {
-               service->network = network;
+               connman_network_unref(service->network);
+               service->network = connman_network_ref(network);
 
                strength_changed(service);
        }
 
        if (service->network == NULL)
-               service->network = network;
+               service->network = connman_network_ref(network);
 
        iter = g_hash_table_lookup(service_hash, service->identifier);
        if (iter != NULL)