diff options
author | Gustavo Padovan <gustavo.padovan@collabora.co.uk> | 2012-08-09 18:57:26 -0300 |
---|---|---|
committer | Patrik Flykt <patrik.flykt@linux.intel.com> | 2012-08-10 17:10:46 +0300 |
commit | 3f539364a2d0db7887bd943cd7bf6206f0d4dd5b (patch) | |
tree | 261fb7566ad2e5d11360160a455ae80a20fb0e4c | |
parent | 01126286f96856aab6b0de171830f4e8e842e1da (diff) | |
download | connman-3f539364a2d0db7887bd943cd7bf6206f0d4dd5b.tar.gz connman-3f539364a2d0db7887bd943cd7bf6206f0d4dd5b.tar.bz2 connman-3f539364a2d0db7887bd943cd7bf6206f0d4dd5b.zip |
dundee: Clean up device in case of setup failure
If the creation and registration of Bluetooth DUN device fails we need to
clean up before return, otherwise we leak memory.
-rw-r--r-- | plugins/dundee.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/plugins/dundee.c b/plugins/dundee.c index 0dae0c96..99fc5c63 100644 --- a/plugins/dundee.c +++ b/plugins/dundee.c @@ -86,17 +86,20 @@ static char *get_ident(const char *path) return pos + 1; } -static void create_device(struct dundee_data *info) +static int create_device(struct dundee_data *info) { struct connman_device *device; char *ident; + int err; DBG("%s", info->path); ident = g_strdup(get_ident(info->path)); device = connman_device_create(ident, CONNMAN_DEVICE_TYPE_BLUETOOTH); - if (device == NULL) + if (device == NULL) { + err = -ENOMEM; goto out; + } DBG("device %p", device); @@ -106,7 +109,8 @@ static void create_device(struct dundee_data *info) connman_device_set_data(device, info); - if (connman_device_register(device) < 0) { + err = connman_device_register(device); + if (err < 0) { connman_error("Failed to register DUN device"); connman_device_unref(device); goto out; @@ -116,6 +120,7 @@ static void create_device(struct dundee_data *info) out: g_free(ident); + return err; } static void destroy_device(struct dundee_data *info) @@ -150,17 +155,18 @@ static void device_destroy(gpointer data) g_free(info); } -static void create_network(struct dundee_data *info) +static int create_network(struct dundee_data *info) { struct connman_network *network; const char *group; + int err; DBG("%s", info->path); network = connman_network_create(info->path, CONNMAN_NETWORK_TYPE_BLUETOOTH_DUN); if (network == NULL) - return; + return -ENOMEM; DBG("network %p", network); @@ -176,12 +182,15 @@ static void create_network(struct dundee_data *info) connman_network_set_available(network, TRUE); - if (connman_device_add_network(info->device, network) < 0) { + err = connman_device_add_network(info->device, network); + if (err < 0) { connman_network_unref(network); - return; + return err; } info->network = network; + + return 0; } static void set_connected(struct dundee_data *info) @@ -556,6 +565,7 @@ static gboolean device_changed(DBusConnection *conn, static void add_device(const char *path, DBusMessageIter *properties) { struct dundee_data *info; + int err; info = g_hash_table_lookup(dundee_devices, path); if (info != NULL) @@ -601,11 +611,25 @@ static void add_device(const char *path, DBusMessageIter *properties) g_hash_table_insert(dundee_devices, g_strdup(path), info); - create_device(info); - create_network(info); + err = create_device(info); + if (err < 0) + goto out; + + err = create_network(info); + if (err < 0) { + destroy_device(info); + goto out; + } if (info->active == TRUE) set_connected(info); + +out: + g_hash_table_remove(dundee_devices, path); + + g_free(info->path); + g_free(info->name); + g_free(info); } static gboolean device_added(DBusConnection *conn, DBusMessage *message, |