summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJukka Rissanen <jukka.rissanen@nokia.com>2011-01-05 15:14:12 +0200
committerMarcel Holtmann <marcel@holtmann.org>2011-01-05 18:51:30 -0800
commit69c8823882a5c2eb6e76628e1695f54e81383ace (patch)
tree25c24c9148de8c5089115e16ba27c8bb69348b1c /src
parent0131fc0fb3928c2c50973d94768ff8bd0a70ac8b (diff)
downloadconnman-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')
-rw-r--r--src/service.c40
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);