Fix parsing error in IP addresses in resourceURIs
authorJohn Light <john.j.light@intel.com>
Wed, 29 Jul 2015 22:33:15 +0000 (15:33 -0700)
committerJon A. Cruz <jonc@osg.samsung.com>
Mon, 10 Aug 2015 22:06:23 +0000 (22:06 +0000)
Change-Id: Ia08ce526ffa759a5749a90d0d31ff5dbca60b072
Signed-off-by: John Light <john.j.light@intel.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/2120
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Naga Ashok Jampani <jn.ashok@samsung.com>
Reviewed-by: Erich Keane <erich.keane@intel.com>
Reviewed-by: Jon A. Cruz <jonc@osg.samsung.com>
resource/csdk/stack/src/ocstack.c

index 4808272..da12be7 100644 (file)
@@ -1824,55 +1824,54 @@ static OCStackResult ParseRequestUri(const char *fullUri,
     size_t len = 0;
     if (urlLen && devAddr)
     {   // construct OCDevAddr
-        if (OC_ADAPTER_IP == adapter)
-        {
-            if (start[0] == '[')
-            {   // ipv6 address
-                char *close = strchr(++start, ']');
-                if (!close || close > slash)
-                {
-                    return OC_STACK_INVALID_URI;
-                }
-                end = close;
-                if (close[1] == ':')
-                {
-                    colon = close + 1;
-                }
+        if (start[0] == '[')
+        {   // ipv6 address
+            char *close = strchr(++start, ']');
+            if (!close || close > slash)
+            {
+                return OC_STACK_INVALID_URI;
             }
-            else
+            end = close;
+            if (close[1] == ':')
+            {
+                colon = close + 1;
+            }
+            adapter = (OCTransportAdapter)(adapter | OC_ADAPTER_IP);
+            flags = (OCTransportFlags)(flags | OC_IP_USE_V6);
+        }
+        else
+        {
+            char *dot = strchr(start, '.');
+            if (dot && dot < slash)
             {   // ipv4 address
-                end = slash;
                 colon = strchr(start, ':');
                 end = (colon && colon < slash) ? colon : slash;
+                adapter = (OCTransportAdapter)(adapter | OC_ADAPTER_IP);
+                flags = (OCTransportFlags)(flags | OC_IP_USE_V4);
             }
-            len = end - start;
-            if (len >= sizeof(da->addr))
-            {
-                return OC_STACK_INVALID_URI;
+            else
+            {   // MAC address
+                end = slash;
             }
-            // collect port, if any
-            if (colon && colon < slash)
+        }
+        len = end - start;
+        if (len >= sizeof(da->addr))
+        {
+            return OC_STACK_INVALID_URI;
+        }
+        // collect port, if any
+        if (colon && colon < slash)
+        {
+            for (colon++; colon < slash; colon++)
             {
-                for (colon++; colon < slash; colon++)
+                char c = colon[0];
+                if (c < '0' || c > '9')
                 {
-                    char c = colon[0];
-                    if (c < '0' || c > '9')
-                    {
-                        return OC_STACK_INVALID_URI;
-                    }
-                    port = 10 * port + c - '0';
+                    return OC_STACK_INVALID_URI;
                 }
+                port = 10 * port + c - '0';
             }
         }
-        else
-        {
-            /**
-             * This is for Non-IP adapters(EDR and BLE).
-             * The address will be between "//" and "/" in the request URI.
-             * [Ex. coap://AB:BC:CD:DE:EF:FG/resource_uri]
-             */
-            end = slash;
-        }
 
         len = end - start;
         if (len >= sizeof(da->addr))