From 05cc84d9f0987ec64511fc25235053ef0796b8a2 Mon Sep 17 00:00:00 2001 From: John Light Date: Wed, 29 Jul 2015 15:33:15 -0700 Subject: [PATCH] Fix parsing error in IP addresses in resourceURIs Change-Id: Ia08ce526ffa759a5749a90d0d31ff5dbca60b072 Signed-off-by: John Light Reviewed-on: https://gerrit.iotivity.org/gerrit/2120 Tested-by: jenkins-iotivity Reviewed-by: Naga Ashok Jampani Reviewed-by: Erich Keane Reviewed-by: Jon A. Cruz --- resource/csdk/stack/src/ocstack.c | 75 +++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/resource/csdk/stack/src/ocstack.c b/resource/csdk/stack/src/ocstack.c index 4808272..da12be7 100644 --- a/resource/csdk/stack/src/ocstack.c +++ b/resource/csdk/stack/src/ocstack.c @@ -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)) -- 2.7.4