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.
---
This should fix Richard Röjfors' problems.
gsupplicant/supplicant.c | 30 +++++++++++++++++++-----------
1 file changed, 19 insertions(+), 11 deletions(-)
diff --git a/gsupplicant/supplicant.c b/gsupplicant/supplicant.c
index b483f9b..96dfc74 100644
--- a/gsupplicant/supplicant.c
+++ b/gsupplicant/supplicant.c
@@ -2689,9 +2689,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;
@@ -2721,6 +2721,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)
{
@@ -2743,7 +2751,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);
@@ -2794,7 +2802,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)
@@ -2852,7 +2860,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;
@@ -2877,7 +2885,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)
@@ -2909,9 +2917,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;
@@ -2922,7 +2930,7 @@ int g_supplicant_interface_create(const char *ifname,
const char *driver,
interface_get_result, data,
NULL, NULL);
if (ret < 0)
- dbus_free(data);
+ interface_create_data_free(data);
return ret;
}
--
1.9.1
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman