openconnect: Domain pointer was used incorrectly
authorJukka Rissanen <jukka.rissanen@linux.intel.com>
Fri, 30 Nov 2012 09:30:41 +0000 (11:30 +0200)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Fri, 30 Nov 2012 13:01:18 +0000 (15:01 +0200)
We must allocate the domain name from the heap and not
point to it directly because the dbus library will deallocate
it and we will have invalid memory access.

vpn/plugins/openconnect.c

index af30063..d36662c 100644 (file)
@@ -57,7 +57,7 @@ static int oc_notify(DBusMessage *msg, struct vpn_provider *provider)
 {
        DBusMessageIter iter, dict;
        const char *reason, *key, *value;
-       const char *domain = NULL;
+       char *domain = NULL;
        char *addressv4 = NULL, *addressv6 = NULL;
        char *netmask = NULL, *gateway = NULL;
        unsigned char prefix_len = 0;
@@ -76,7 +76,7 @@ static int oc_notify(DBusMessage *msg, struct vpn_provider *provider)
        if (strcmp(reason, "connect"))
                return VPN_STATE_DISCONNECT;
 
-       domain = vpn_provider_get_string(provider, "VPN.Domain");
+       domain = g_strdup(vpn_provider_get_string(provider, "VPN.Domain"));
 
        dbus_message_iter_recurse(&iter, &dict);
 
@@ -126,8 +126,10 @@ static int oc_notify(DBusMessage *msg, struct vpn_provider *provider)
                if (!strcmp(key, "CISCO_PROXY_PAC"))
                        vpn_provider_set_pac(provider, value);
 
-               if (domain == NULL && !strcmp(key, "CISCO_DEF_DOMAIN"))
-                       domain = value;
+               if (domain == NULL && !strcmp(key, "CISCO_DEF_DOMAIN")) {
+                       g_free(domain);
+                       domain = g_strdup(value);
+               }
 
                if (g_str_has_prefix(key, "CISCO_SPLIT_INC") == TRUE ||
                        g_str_has_prefix(key, "CISCO_IPV6_SPLIT_INC") == TRUE)
@@ -150,6 +152,7 @@ static int oc_notify(DBusMessage *msg, struct vpn_provider *provider)
                g_free(addressv6);
                g_free(netmask);
                g_free(gateway);
+               g_free(domain);
 
                return VPN_STATE_FAILURE;
        }
@@ -167,6 +170,7 @@ static int oc_notify(DBusMessage *msg, struct vpn_provider *provider)
        g_free(addressv6);
        g_free(netmask);
        g_free(gateway);
+       g_free(domain);
        connman_ipaddress_free(ipaddress);
 
        return VPN_STATE_CONNECT;