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

Reply via email to