diff options
author | Patrik Flykt <patrik.flykt@linux.intel.com> | 2014-05-16 11:06:56 +0300 |
---|---|---|
committer | Patrik Flykt <patrik.flykt@linux.intel.com> | 2014-05-19 14:44:46 +0300 |
commit | fcfb91bf18f3545c6ecad192b0c0544c844090ca (patch) | |
tree | 9d096aa90ee96d9e111b84c5fdbbd79931f2d253 | |
parent | b27b6034454e7ac4ce380a6e1680eadfa7bf63ce (diff) | |
download | connman-fcfb91bf18f3545c6ecad192b0c0544c844090ca.tar.gz |
gsupplicant: Allocate memory for data that is to be used in callback
When gsupplicant is handed interface data, allocate memory for the
supplied strings as the caller might free them at any point. Create
a helper function freeing the strings and the structure itself.
-rw-r--r-- | gsupplicant/supplicant.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c index 8290f641..2674298a 100644 --- a/gsupplicant/supplicant.c +++ b/gsupplicant/supplicant.c @@ -2678,9 +2678,9 @@ struct interface_data { }; struct interface_create_data { - const char *ifname; - const char *driver; - const char *bridge; + char *ifname; + char *driver; + char *bridge; GSupplicantInterface *interface; GSupplicantInterfaceCallback callback; void *user_data; @@ -2710,6 +2710,14 @@ struct interface_autoscan_data { void *user_data; }; +static void interface_create_data_free(struct interface_create_data *data) +{ + g_free(data->ifname); + g_free(data->driver); + g_free(data->bridge); + dbus_free(data); +} + static bool interface_exists(GSupplicantInterface *interface, const char *path) { @@ -2732,7 +2740,7 @@ static void interface_create_property(const char *key, DBusMessageIter *iter, if (data->callback) data->callback(0, data->interface, data->user_data); - dbus_free(data); + interface_create_data_free(data); } interface_property(key, iter, interface); @@ -2783,7 +2791,7 @@ done: if (data->callback) data->callback(err, NULL, data->user_data); - dbus_free(data); + interface_create_data_free(data); } static void interface_create_params(DBusMessageIter *iter, void *user_data) @@ -2839,7 +2847,7 @@ static void interface_get_result(const char *error, if (data->callback) data->callback(0, interface, data->user_data); - dbus_free(data); + interface_create_data_free(data); return; @@ -2864,7 +2872,7 @@ done: if (data->callback) data->callback(err, NULL, data->user_data); - dbus_free(data); + interface_create_data_free(data); } static void interface_get_params(DBusMessageIter *iter, void *user_data) @@ -2896,9 +2904,9 @@ int g_supplicant_interface_create(const char *ifname, const char *driver, if (!data) return -ENOMEM; - data->ifname = ifname; - data->driver = driver; - data->bridge = bridge; + data->ifname = g_strdup(ifname); + data->driver = g_strdup(driver); + data->bridge = g_strdup(bridge); data->callback = callback; data->user_data = user_data; @@ -2909,7 +2917,7 @@ int g_supplicant_interface_create(const char *ifname, const char *driver, interface_get_result, data, NULL); if (ret < 0) - dbus_free(data); + interface_create_data_free(data); return ret; } |