diff options
author | Jukka Rissanen <jukka.rissanen@nokia.com> | 2011-01-05 15:14:12 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2011-01-05 18:51:30 -0800 |
commit | 69c8823882a5c2eb6e76628e1695f54e81383ace (patch) | |
tree | 25c24c9148de8c5089115e16ba27c8bb69348b1c /src/service.c | |
parent | 0131fc0fb3928c2c50973d94768ff8bd0a70ac8b (diff) | |
download | connman-69c8823882a5c2eb6e76628e1695f54e81383ace.tar.gz connman-69c8823882a5c2eb6e76628e1695f54e81383ace.tar.bz2 connman-69c8823882a5c2eb6e76628e1695f54e81383ace.zip |
memoryleak: ipconfig was not unreferenced properly
The service creates ipconfig and then enables it which means that
ref count goes to 2. At some point it then disables ipconfig but
does not do unref which means there is a memory leak as ref count
never goes to 0.
Diffstat (limited to 'src/service.c')
-rw-r--r-- | src/service.c | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/src/service.c b/src/service.c index 09cc4eb3..0002609f 100644 --- a/src/service.c +++ b/src/service.c @@ -2232,13 +2232,15 @@ static gboolean connect_timeout(gpointer user_data) if (service->network != NULL) __connman_network_disconnect(service->network); - if (service->ipconfig_ipv4) - if (__connman_ipconfig_disable(service->ipconfig_ipv4) == 0) - service->ipconfig_ipv4 = NULL; + if (__connman_ipconfig_disable(service->ipconfig_ipv4) == 0) { + connman_ipconfig_unref(service->ipconfig_ipv4); + service->ipconfig_ipv4 = NULL; + } - if (service->ipconfig_ipv6) - if (__connman_ipconfig_disable(service->ipconfig_ipv6) == 0) - service->ipconfig_ipv6 = NULL; + if (__connman_ipconfig_disable(service->ipconfig_ipv6) == 0) { + connman_ipconfig_unref(service->ipconfig_ipv6); + service->ipconfig_ipv6 = NULL; + } __connman_stats_service_unregister(service); @@ -3351,15 +3353,17 @@ int __connman_service_connect(struct connman_service *service) if (err < 0) { if (err != -EINPROGRESS) { - if (service->ipconfig_ipv4) - if (__connman_ipconfig_disable( - service->ipconfig_ipv4) == 0) - service->ipconfig_ipv4 = NULL; + if (__connman_ipconfig_disable( + service->ipconfig_ipv4) == 0) { + connman_ipconfig_unref(service->ipconfig_ipv4); + service->ipconfig_ipv4 = NULL; + } - if (service->ipconfig_ipv6) - if (__connman_ipconfig_disable( - service->ipconfig_ipv6) == 0) - service->ipconfig_ipv6 = NULL; + if (__connman_ipconfig_disable( + service->ipconfig_ipv6) == 0) { + connman_ipconfig_unref(service->ipconfig_ipv6); + service->ipconfig_ipv6 = NULL; + } __connman_stats_service_unregister(service); if (service->userconnect == TRUE) @@ -3406,11 +3410,15 @@ int __connman_service_disconnect(struct connman_service *service) __connman_ipconfig_clear_address(service->ipconfig_ipv4); __connman_ipconfig_clear_address(service->ipconfig_ipv6); - if (__connman_ipconfig_disable(service->ipconfig_ipv4) == 0) + if (__connman_ipconfig_disable(service->ipconfig_ipv4) == 0) { + connman_ipconfig_unref(service->ipconfig_ipv4); service->ipconfig_ipv4 = NULL; + } - if (__connman_ipconfig_disable(service->ipconfig_ipv6) == 0) + if (__connman_ipconfig_disable(service->ipconfig_ipv6) == 0) { + connman_ipconfig_unref(service->ipconfig_ipv6); service->ipconfig_ipv6 = NULL; + } __connman_stats_service_unregister(service); |