summaryrefslogtreecommitdiff
path: root/plugins/dhclient.c
diff options
context:
space:
mode:
authorPekka Pessi <Pekka.Pessi@nokia.com>2010-07-09 14:14:24 +0300
committerMarcel Holtmann <marcel@holtmann.org>2010-07-09 09:50:33 -0300
commitfe1e4c2420c27c51af70a44a04b3a584a99d73c4 (patch)
tree02007f2ca6e743e52302442f3b685fffd59b8941 /plugins/dhclient.c
parentcfd8c99cccccd6bdb121f77bd8bf8eeb05b522ec (diff)
downloadconnman-fe1e4c2420c27c51af70a44a04b3a584a99d73c4.tar.gz
connman-fe1e4c2420c27c51af70a44a04b3a584a99d73c4.tar.bz2
connman-fe1e4c2420c27c51af70a44a04b3a584a99d73c4.zip
Fix crash in dhclient release
Diffstat (limited to 'plugins/dhclient.c')
-rw-r--r--plugins/dhclient.c40
1 files changed, 22 insertions, 18 deletions
diff --git a/plugins/dhclient.c b/plugins/dhclient.c
index fd867739..4a25c275 100644
--- a/plugins/dhclient.c
+++ b/plugins/dhclient.c
@@ -114,15 +114,34 @@ struct dhclient_data {
char *ifname;
};
+static void dhclient_unlink(const char *ifname)
+{
+ char *pathname;
+
+ pathname = g_strdup_printf("%s/dhclient.%s.pid",
+ STATEDIR, ifname);
+ unlink(pathname);
+ g_free(pathname);
+
+ pathname = g_strdup_printf("%s/dhclient.%s.leases",
+ STATEDIR, ifname);
+ unlink(pathname);
+ g_free(pathname);
+}
+
static void dhclient_died(struct connman_task *task, void *user_data)
{
struct dhclient_data *dhclient = user_data;
+ connman_dhcp_set_data(dhclient->dhcp, NULL);
+
connman_dhcp_unref(dhclient->dhcp);
connman_task_destroy(dhclient->task);
dhclient->task = NULL;
+ dhclient_unlink(dhclient->ifname);
+
g_free(dhclient->ifname);
g_free(dhclient);
}
@@ -156,21 +175,6 @@ static void dhclient_setup(struct connman_task *task, const char *ifname)
connman_task_add_argument(task, "-n", NULL);
}
-static void dhclient_unlink(const char *ifname)
-{
- char *pathname;
-
- pathname = g_strdup_printf("%s/dhclient.%s.pid",
- STATEDIR, ifname);
- unlink(pathname);
- g_free(pathname);
-
- pathname = g_strdup_printf("%s/dhclient.%s.leases",
- STATEDIR, ifname);
- unlink(pathname);
- g_free(pathname);
-}
-
static int dhclient_request(struct connman_dhcp *dhcp)
{
struct dhclient_data *dhclient;
@@ -212,10 +216,10 @@ static int dhclient_release(struct connman_dhcp *dhcp)
DBG("dhcp %p", dhcp);
- if (dhclient->task != NULL)
- connman_task_stop(dhclient->task);
+ if (dhclient == NULL)
+ return -ESRCH;
- dhclient_unlink(dhclient->ifname);
+ connman_task_stop(dhclient->task);
return 0;
}