summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrik Flykt <patrik.flykt@linux.intel.com>2014-05-16 11:06:56 +0300
committerPatrik Flykt <patrik.flykt@linux.intel.com>2014-05-19 14:44:46 +0300
commitfcfb91bf18f3545c6ecad192b0c0544c844090ca (patch)
tree9d096aa90ee96d9e111b84c5fdbbd79931f2d253
parentb27b6034454e7ac4ce380a6e1680eadfa7bf63ce (diff)
downloadconnman-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.c30
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;
}