mirror of
https://github.com/cesanta/mongoose.git
synced 2026-11-10 16:31:44 +00:00
improve mg_aton6 and tests
This commit is contained in:
1 parent
771f5f2ed9
commit
6cbd810206
3 files changed
+49
-20
No files matched your search
+21
-10
@@ -7883,22 +7883,31 @@ static bool mg_v4mapped(struct mg_str str, struct mg_addr *addr) {
|
|||||||
|
|
||||||
static bool mg_aton6(struct mg_str str, struct mg_addr *addr) {
|
static bool mg_aton6(struct mg_str str, struct mg_addr *addr) {
|
||||||
size_t i, j = 0, n = 0, dc = 42;
|
size_t i, j = 0, n = 0, dc = 42;
|
||||||
|
uint16_t val = 0;
|
||||||
|
bool have = false;
|
||||||
addr->scope_id = 0;
|
addr->scope_id = 0;
|
||||||
if (str.len > 2 && str.buf[0] == '[') str.buf++, str.len -= 2;
|
if (str.len > 2 && str.buf[0] == '[') str.buf++, str.len -= 2;
|
||||||
if (mg_v4mapped(str, addr)) return true; // sets addr->is_ip6
|
if (mg_v4mapped(str, addr)) return true; // sets addr->is_ip6
|
||||||
for (i = 0; i < str.len; i++) {
|
for (i = 0; i < str.len; i++) {
|
||||||
if ((str.buf[i] >= '0' && str.buf[i] <= '9') ||
|
int x = str.buf[i] >= '0' && str.buf[i] <= '9' ? str.buf[i] - '0'
|
||||||
(str.buf[i] >= 'a' && str.buf[i] <= 'f') ||
|
: str.buf[i] >= 'a' && str.buf[i] <= 'f' ? str.buf[i] - 'a' + 10
|
||||||
(str.buf[i] >= 'A' && str.buf[i] <= 'F')) {
|
: str.buf[i] >= 'A' && str.buf[i] <= 'F' ? str.buf[i] - 'A' + 10
|
||||||
unsigned long val = 0; // TODO(): This loops on chars, refactor
|
: -1;
|
||||||
|
if (x >= 0) {
|
||||||
if (i > j + 3) return false;
|
if (i > j + 3) return false;
|
||||||
// MG_DEBUG(("%lu %lu [%.*s]", i, j, (int) (i - j + 1), &str.buf[j]));
|
val = (uint16_t) ((val << 4) | (uint16_t) x);
|
||||||
mg_str_to_num(mg_str_n(&str.buf[j], i - j + 1), 16, &val, sizeof(val));
|
have = true;
|
||||||
addr->addr.ip[n] = (uint8_t) ((val >> 8) & 255);
|
continue;
|
||||||
addr->addr.ip[n + 1] = (uint8_t) (val & 255);
|
}
|
||||||
} else if (str.buf[i] == ':') {
|
if (have) {
|
||||||
|
addr->addr.ip[n] = (uint8_t) (val >> 8),
|
||||||
|
addr->addr.ip[n + 1] = (uint8_t) val;
|
||||||
|
val = 0, have = false;
|
||||||
|
}
|
||||||
|
if (str.buf[i] == ':') {
|
||||||
j = i + 1;
|
j = i + 1;
|
||||||
if (i > 0 && str.buf[i - 1] == ':') {
|
if (i > 0 && str.buf[i - 1] == ':') {
|
||||||
|
if (dc != 42) return false;
|
||||||
dc = n; // Double colon
|
dc = n; // Double colon
|
||||||
if (i > 1 && str.buf[i - 2] == ':') return false;
|
if (i > 1 && str.buf[i - 2] == ':') return false;
|
||||||
} else if (i > 0) {
|
} else if (i > 0) {
|
||||||
@@ -7918,12 +7927,14 @@ static bool mg_aton6(struct mg_str str, struct mg_addr *addr) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (have)
|
||||||
|
addr->addr.ip[n] = (uint8_t) (val >> 8),
|
||||||
|
addr->addr.ip[n + 1] = (uint8_t) val;
|
||||||
if (n < 14 && dc == 42) return false;
|
if (n < 14 && dc == 42) return false;
|
||||||
if (n < 14) {
|
if (n < 14) {
|
||||||
memmove(&addr->addr.ip[dc + (14 - n)], &addr->addr.ip[dc], n - dc + 2);
|
memmove(&addr->addr.ip[dc + (14 - n)], &addr->addr.ip[dc], n - dc + 2);
|
||||||
memset(&addr->addr.ip[dc], 0, 14 - n);
|
memset(&addr->addr.ip[dc], 0, 14 - n);
|
||||||
}
|
}
|
||||||
|
|
||||||
addr->is_ip6 = true;
|
addr->is_ip6 = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,22 +85,31 @@ static bool mg_v4mapped(struct mg_str str, struct mg_addr *addr) {
|
|||||||
|
|
||||||
static bool mg_aton6(struct mg_str str, struct mg_addr *addr) {
|
static bool mg_aton6(struct mg_str str, struct mg_addr *addr) {
|
||||||
size_t i, j = 0, n = 0, dc = 42;
|
size_t i, j = 0, n = 0, dc = 42;
|
||||||
|
uint16_t val = 0;
|
||||||
|
bool have = false;
|
||||||
addr->scope_id = 0;
|
addr->scope_id = 0;
|
||||||
if (str.len > 2 && str.buf[0] == '[') str.buf++, str.len -= 2;
|
if (str.len > 2 && str.buf[0] == '[') str.buf++, str.len -= 2;
|
||||||
if (mg_v4mapped(str, addr)) return true; // sets addr->is_ip6
|
if (mg_v4mapped(str, addr)) return true; // sets addr->is_ip6
|
||||||
for (i = 0; i < str.len; i++) {
|
for (i = 0; i < str.len; i++) {
|
||||||
if ((str.buf[i] >= '0' && str.buf[i] <= '9') ||
|
int x = str.buf[i] >= '0' && str.buf[i] <= '9' ? str.buf[i] - '0'
|
||||||
(str.buf[i] >= 'a' && str.buf[i] <= 'f') ||
|
: str.buf[i] >= 'a' && str.buf[i] <= 'f' ? str.buf[i] - 'a' + 10
|
||||||
(str.buf[i] >= 'A' && str.buf[i] <= 'F')) {
|
: str.buf[i] >= 'A' && str.buf[i] <= 'F' ? str.buf[i] - 'A' + 10
|
||||||
unsigned long val = 0; // TODO(): This loops on chars, refactor
|
: -1;
|
||||||
|
if (x >= 0) {
|
||||||
if (i > j + 3) return false;
|
if (i > j + 3) return false;
|
||||||
// MG_DEBUG(("%lu %lu [%.*s]", i, j, (int) (i - j + 1), &str.buf[j]));
|
val = (uint16_t) ((val << 4) | (uint16_t) x);
|
||||||
mg_str_to_num(mg_str_n(&str.buf[j], i - j + 1), 16, &val, sizeof(val));
|
have = true;
|
||||||
addr->addr.ip[n] = (uint8_t) ((val >> 8) & 255);
|
continue;
|
||||||
addr->addr.ip[n + 1] = (uint8_t) (val & 255);
|
}
|
||||||
} else if (str.buf[i] == ':') {
|
if (have) {
|
||||||
|
addr->addr.ip[n] = (uint8_t) (val >> 8),
|
||||||
|
addr->addr.ip[n + 1] = (uint8_t) val;
|
||||||
|
val = 0, have = false;
|
||||||
|
}
|
||||||
|
if (str.buf[i] == ':') {
|
||||||
j = i + 1;
|
j = i + 1;
|
||||||
if (i > 0 && str.buf[i - 1] == ':') {
|
if (i > 0 && str.buf[i - 1] == ':') {
|
||||||
|
if (dc != 42) return false;
|
||||||
dc = n; // Double colon
|
dc = n; // Double colon
|
||||||
if (i > 1 && str.buf[i - 2] == ':') return false;
|
if (i > 1 && str.buf[i - 2] == ':') return false;
|
||||||
} else if (i > 0) {
|
} else if (i > 0) {
|
||||||
@@ -120,12 +129,14 @@ static bool mg_aton6(struct mg_str str, struct mg_addr *addr) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (have)
|
||||||
|
addr->addr.ip[n] = (uint8_t) (val >> 8),
|
||||||
|
addr->addr.ip[n + 1] = (uint8_t) val;
|
||||||
if (n < 14 && dc == 42) return false;
|
if (n < 14 && dc == 42) return false;
|
||||||
if (n < 14) {
|
if (n < 14) {
|
||||||
memmove(&addr->addr.ip[dc + (14 - n)], &addr->addr.ip[dc], n - dc + 2);
|
memmove(&addr->addr.ip[dc + (14 - n)], &addr->addr.ip[dc], n - dc + 2);
|
||||||
memset(&addr->addr.ip[dc], 0, 14 - n);
|
memset(&addr->addr.ip[dc], 0, 14 - n);
|
||||||
}
|
}
|
||||||
|
|
||||||
addr->is_ip6 = true;
|
addr->is_ip6 = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2855,6 +2855,13 @@ static void test_util(void) {
|
|||||||
e = "\x20\x01\x48\x60\x48\x60\x00\x00\x00\x00\x00\x00\x00\x00\x88\x88";
|
e = "\x20\x01\x48\x60\x48\x60\x00\x00\x00\x00\x00\x00\x00\x00\x88\x88";
|
||||||
ASSERT(memcmp(&a.addr.ip6, e, sizeof(a.addr.ip6)) == 0);
|
ASSERT(memcmp(&a.addr.ip6, e, sizeof(a.addr.ip6)) == 0);
|
||||||
|
|
||||||
|
ASSERT(mg_aton(mg_str("12345::1"), &a) == false);
|
||||||
|
ASSERT(mg_aton(mg_str("1:::2"), &a) == false);
|
||||||
|
ASSERT(mg_aton(mg_str("1::2::3"), &a) == false);
|
||||||
|
ASSERT(mg_aton(mg_str("1:2:3:4:5:6:7"), &a) == false);
|
||||||
|
ASSERT(mg_aton(mg_str("1:2:3:4:5:6:7:8:9"), &a) == false);
|
||||||
|
ASSERT(mg_aton(mg_str("1:2:3:4:5:6:7:g"), &a) == false);
|
||||||
|
|
||||||
ASSERT(mg_url_decode("a=%", 3, buf, sizeof(buf), 0) < 0);
|
ASSERT(mg_url_decode("a=%", 3, buf, sizeof(buf), 0) < 0);
|
||||||
ASSERT(mg_url_decode("&&&a=%", 6, buf, sizeof(buf), 0) < 0);
|
ASSERT(mg_url_decode("&&&a=%", 6, buf, sizeof(buf), 0) < 0);
|
||||||
ASSERT(mg_url_decode("a=%1", 4, buf, sizeof(buf), 0) < 0);
|
ASSERT(mg_url_decode("a=%1", 4, buf, sizeof(buf), 0) < 0);
|
||||||
|
|||||||
Reference in new issue
Block a user