Fix resource leak
[platform/upstream/connman.git] / src / proxy.c
old mode 100644 (file)
new mode 100755 (executable)
index fd58a70..e1bc420
@@ -44,6 +44,9 @@ struct proxy_lookup {
 
 static void remove_lookup(struct proxy_lookup *lookup)
 {
+       if (lookup->watch > 0)
+               g_source_remove(lookup->watch);
+
        lookup_list = g_slist_remove(lookup_list, lookup);
 
        connman_service_unref(lookup->service);
@@ -69,7 +72,7 @@ static gboolean lookup_callback(gpointer user_data)
        struct proxy_lookup *lookup = user_data;
        GSList *list;
 
-       if (lookup == NULL)
+       if (!lookup)
                return FALSE;
 
        lookup->watch = 0;
@@ -77,14 +80,14 @@ static gboolean lookup_callback(gpointer user_data)
        for (list = driver_list; list; list = list->next) {
                struct connman_proxy_driver *proxy = list->data;
 
-               if (proxy->request_lookup == NULL)
+               if (!proxy->request_lookup)
                        continue;
 
                lookup->proxy = proxy;
                break;
        }
 
-       if (lookup->proxy == NULL ||
+       if (!lookup->proxy ||
                lookup->proxy->request_lookup(lookup->service,
                                                lookup->url) < 0) {
 
@@ -106,11 +109,11 @@ unsigned int connman_proxy_lookup(const char *interface, const char *url,
 
        DBG("interface %s url %s", interface, url);
 
-       if (interface == NULL)
+       if (!interface)
                return 0;
 
        lookup = g_try_new0(struct proxy_lookup, 1);
-       if (lookup == NULL)
+       if (!lookup)
                return 0;
 
        lookup->token = next_lookup_token++;
@@ -120,7 +123,7 @@ unsigned int connman_proxy_lookup(const char *interface, const char *url,
        lookup->url = g_strdup(url);
        lookup->service = connman_service_ref(service);
 
-       lookup->watch = g_timeout_add_seconds(0, lookup_callback, lookup);
+       lookup->watch = g_idle_add(lookup_callback, lookup);
        if (lookup->watch == 0) {
                g_free(lookup->url);
                g_free(lookup);
@@ -128,7 +131,7 @@ unsigned int connman_proxy_lookup(const char *interface, const char *url,
        }
 
        DBG("token %u", lookup->token);
-       lookup_list = g_slist_append(lookup_list, lookup);
+       lookup_list = g_slist_prepend(lookup_list, lookup);
 
        return lookup->token;
 }
@@ -145,16 +148,13 @@ void connman_proxy_lookup_cancel(unsigned int token)
 
                if (lookup->token == token)
                        break;
-       }
 
-       if (lookup != NULL) {
-               if (lookup->watch > 0) {
-                       g_source_remove(lookup->watch);
-                       lookup->watch = 0;
-               }
+               lookup = NULL;
+       }
 
-               if (lookup->proxy != NULL &&
-                                       lookup->proxy->cancel_lookup != NULL)
+       if (lookup) {
+               if (lookup->proxy &&
+                                       lookup->proxy->cancel_lookup)
                        lookup->proxy->cancel_lookup(lookup->service,
                                                                lookup->url);
 
@@ -163,7 +163,7 @@ void connman_proxy_lookup_cancel(unsigned int token)
 }
 
 void connman_proxy_driver_lookup_notify(struct connman_service *service,
-                                        const char *url, const char *result)
+                                       const char *url, const char *result)
 {
        GSList *list, *matches = NULL;
 
@@ -179,11 +179,11 @@ void connman_proxy_driver_lookup_notify(struct connman_service *service,
                        if (lookup->cb)
                                lookup->cb(result, lookup->user_data);
 
-                       matches = g_slist_append(matches, lookup);
+                       matches = g_slist_prepend(matches, lookup);
                }
        }
 
-       if (matches != NULL)
+       if (matches)
                remove_lookups(matches);
 }