provider: Fix network/netmask parsing and potential crash
authorPatrik Flykt <patrik.flykt@linux.intel.com>
Tue, 8 May 2012 10:14:07 +0000 (13:14 +0300)
committerPatrik Flykt <patrik.flykt@linux.intel.com>
Tue, 8 May 2012 12:55:40 +0000 (15:55 +0300)
src/provider.c

index a3604d4..3f4bb1c 100644 (file)
@@ -113,15 +113,25 @@ static void set_user_networks(struct connman_provider *provider,
 
        while (networks[i] != NULL) {
                char **elems = g_strsplit(networks[i], "/", 0);
-               char *network, *netmask = NULL;
+               char *network, *netmask;
                int family = PF_UNSPEC, ret;
 
                if (elems == NULL)
                        break;
 
                network = elems[0];
-               if (elems[1] != NULL)
-                       netmask = elems[1];
+               if (network == NULL || *network == '\0') {
+                       DBG("no network/netmask set");
+                       g_strfreev(elems);
+                       break;
+               }
+
+               netmask = elems[1];
+               if (netmask != NULL && *netmask == '\0') {
+                       DBG("no netmask set");
+                       g_strfreev(elems);
+                       break;
+               }
 
                if (g_strrstr(network, ":") != NULL)
                        family = AF_INET6;
@@ -132,7 +142,10 @@ static void set_user_networks(struct connman_provider *provider,
                                /* We have netmask length */
                                in_addr_t addr;
                                struct in_addr netmask_in;
-                               unsigned char prefix_len = atoi(netmask);
+                               unsigned char prefix_len = 32;
+
+                               if (netmask != NULL)
+                                       prefix_len = atoi(netmask);
 
                                addr = 0xffffffff << (32 - prefix_len);
                                netmask_in.s_addr = htonl(addr);