IPv6 address parser: fail on incomplete addresses
This commit is contained in:
parent
d65a926a67
commit
a1b61a271a
3 changed files with 43 additions and 14 deletions
5
lib/ip.c
5
lib/ip.c
|
@ -264,6 +264,9 @@ ip6_pton(const char *a, ip6_addr *o)
|
||||||
int i, j, k, l, hfil;
|
int i, j, k, l, hfil;
|
||||||
const char *start;
|
const char *start;
|
||||||
|
|
||||||
|
if (!a[0]) /* Empty string check */
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (a[0] == ':') /* Leading :: */
|
if (a[0] == ':') /* Leading :: */
|
||||||
{
|
{
|
||||||
if (a[1] != ':')
|
if (a[1] != ':')
|
||||||
|
@ -333,6 +336,8 @@ ip6_pton(const char *a, ip6_addr *o)
|
||||||
for (; i>=hfil; i--)
|
for (; i>=hfil; i--)
|
||||||
words[i] = 0;
|
words[i] = 0;
|
||||||
}
|
}
|
||||||
|
else if (i != 8) /* Incomplete address */
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* Convert the address to ip6_addr format */
|
/* Convert the address to ip6_addr format */
|
||||||
for (i=0; i<4; i++)
|
for (i=0; i<4; i++)
|
||||||
|
|
|
@ -13,25 +13,38 @@
|
||||||
#define IP4_MAX_LEN 16
|
#define IP4_MAX_LEN 16
|
||||||
|
|
||||||
static int
|
static int
|
||||||
test_ipa_pton(void *out_, const void *in_, const void *expected_out_)
|
test_ip4_pton(void *out_, const void *in_, const void *expected_out_)
|
||||||
|
{
|
||||||
|
ip_addr *out = out_;
|
||||||
|
const char *in = in_;
|
||||||
|
const ip_addr *expected_out = expected_out_;
|
||||||
|
ip4_addr ip4;
|
||||||
|
|
||||||
|
if (expected_out)
|
||||||
|
{
|
||||||
|
bt_assert(ip4_pton(in, &ip4));
|
||||||
|
*out = ipa_from_ip4(ip4);
|
||||||
|
return ipa_equal(*out, *expected_out);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return !ip4_pton(in, &ip4);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
test_ip6_pton(void *out_, const void *in_, const void *expected_out_)
|
||||||
{
|
{
|
||||||
ip_addr *out = out_;
|
ip_addr *out = out_;
|
||||||
const char *in = in_;
|
const char *in = in_;
|
||||||
const ip_addr *expected_out = expected_out_;
|
const ip_addr *expected_out = expected_out_;
|
||||||
|
|
||||||
if (ipa_is_ip4(*expected_out))
|
if (expected_out)
|
||||||
{
|
|
||||||
ip4_addr ip4;
|
|
||||||
bt_assert(ip4_pton(in, &ip4));
|
|
||||||
*out = ipa_from_ip4(ip4);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
bt_assert(ip6_pton(in, out));
|
bt_assert(ip6_pton(in, out));
|
||||||
/* ip_addr == ip6_addr */
|
return ipa_equal(*out, *expected_out);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
return ipa_equal(*out, *expected_out);
|
return !ip6_pton(in, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -52,7 +65,7 @@ t_ip4_pton(void)
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
return bt_assert_batch(test_vectors, test_ipa_pton, bt_fmt_str, bt_fmt_ipa);
|
return bt_assert_batch(test_vectors, test_ip4_pton, bt_fmt_str, bt_fmt_ipa);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -87,9 +100,17 @@ t_ip6_pton(void)
|
||||||
.in = "2605:2700:0:3::4713:93e3",
|
.in = "2605:2700:0:3::4713:93e3",
|
||||||
.out = & ipa_build6(0x26052700, 0x00000003, 0x00000000, 0x471393E3),
|
.out = & ipa_build6(0x26052700, 0x00000003, 0x00000000, 0x471393E3),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.in = "2605:2700:0:3:4713:93e3",
|
||||||
|
.out = NULL,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.in = "2",
|
||||||
|
.out = NULL,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
return bt_assert_batch(test_vectors, test_ipa_pton, bt_fmt_str, bt_fmt_ipa);
|
return bt_assert_batch(test_vectors, test_ip6_pton, bt_fmt_str, bt_fmt_ipa);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
|
@ -495,7 +495,10 @@ void
|
||||||
bt_fmt_ipa(char *buf, size_t size, const void *data)
|
bt_fmt_ipa(char *buf, size_t size, const void *data)
|
||||||
{
|
{
|
||||||
const ip_addr *ip = data;
|
const ip_addr *ip = data;
|
||||||
bsnprintf(buf, size, "%I", *ip);
|
if (data)
|
||||||
|
bsnprintf(buf, size, "%I", *ip);
|
||||||
|
else
|
||||||
|
bsnprintf(buf, size, "(null)");
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
Loading…
Reference in a new issue