mirror of
https://github.com/golang/go
synced 2024-11-26 03:27:58 -07:00
net/ip: proper ipv6 address parsing
Fixes #57760
Change-Id: Ic3698a18e1c80833b07e0e06bc7328d9714794c6
GitHub-Last-Rev: d185467491
GitHub-Pull-Request: golang/go#57761
Reviewed-on: https://go-review.googlesource.com/c/go/+/461605
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Damien Neil <dneil@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Damien Neil <dneil@google.com>
This commit is contained in:
parent
1922cef5d7
commit
90d24b4f4e
@ -21,7 +21,6 @@ var parseIPTests = []struct {
|
|||||||
{"::ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
|
{"::ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
|
||||||
{"::ffff:7f01:0203", IPv4(127, 1, 2, 3)},
|
{"::ffff:7f01:0203", IPv4(127, 1, 2, 3)},
|
||||||
{"0:0:0:0:0000:ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
|
{"0:0:0:0:0000:ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
|
||||||
{"0:0:0:0:000000:ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
|
|
||||||
{"0:0:0:0::ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
|
{"0:0:0:0::ffff:127.1.2.3", IPv4(127, 1, 2, 3)},
|
||||||
|
|
||||||
{"2001:4860:0:2001::68", IP{0x20, 0x01, 0x48, 0x60, 0, 0, 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0x00, 0x68}},
|
{"2001:4860:0:2001::68", IP{0x20, 0x01, 0x48, 0x60, 0, 0, 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0x00, 0x68}},
|
||||||
@ -37,6 +36,10 @@ var parseIPTests = []struct {
|
|||||||
{"fe80::1%lo0", nil},
|
{"fe80::1%lo0", nil},
|
||||||
{"fe80::1%911", nil},
|
{"fe80::1%911", nil},
|
||||||
{"", nil},
|
{"", nil},
|
||||||
|
//6 zeroes in one group
|
||||||
|
{"0:0:0:0:000000:ffff:127.1.2.3", nil},
|
||||||
|
//5 zeroes in one group edge case
|
||||||
|
{"0:0:0:0:00000:ffff:127.1.2.3", nil},
|
||||||
{"a1:a2:a3:a4::b1:b2:b3:b4", nil}, // Issue 6628
|
{"a1:a2:a3:a4::b1:b2:b3:b4", nil}, // Issue 6628
|
||||||
{"127.001.002.003", nil},
|
{"127.001.002.003", nil},
|
||||||
{"::ffff:127.001.002.003", nil},
|
{"::ffff:127.001.002.003", nil},
|
||||||
|
@ -251,6 +251,10 @@ func parseIPv6(in string) (Addr, error) {
|
|||||||
} else {
|
} else {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
if off > 3 {
|
||||||
|
//more than 4 digits in group, fail.
|
||||||
|
return Addr{}, parseAddrError{in: in, msg: "each group must have 4 or less digits", at: s}
|
||||||
|
}
|
||||||
if acc > math.MaxUint16 {
|
if acc > math.MaxUint16 {
|
||||||
// Overflow, fail.
|
// Overflow, fail.
|
||||||
return Addr{}, parseAddrError{in: in, msg: "IPv6 field has value >=2^16", at: s}
|
return Addr{}, parseAddrError{in: in, msg: "IPv6 field has value >=2^16", at: s}
|
||||||
|
@ -274,6 +274,10 @@ func TestParseAddr(t *testing.T) {
|
|||||||
"fe80:1?:1",
|
"fe80:1?:1",
|
||||||
// IPv6 with truncated bytes after single colon.
|
// IPv6 with truncated bytes after single colon.
|
||||||
"fe80:",
|
"fe80:",
|
||||||
|
// IPv6 with 5 zeros in last group
|
||||||
|
"0:0:0:0:0:ffff:0:00000",
|
||||||
|
// IPv6 with 5 zeros in one group and embedded IPv4
|
||||||
|
"0:0:0:0:00000:ffff:127.1.2.3",
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, s := range invalidIPs {
|
for _, s := range invalidIPs {
|
||||||
@ -1247,7 +1251,6 @@ func TestIs4In6(t *testing.T) {
|
|||||||
{mustIP("::ffff:127.1.2.3"), true, mustIP("127.1.2.3")},
|
{mustIP("::ffff:127.1.2.3"), true, mustIP("127.1.2.3")},
|
||||||
{mustIP("::ffff:7f01:0203"), true, mustIP("127.1.2.3")},
|
{mustIP("::ffff:7f01:0203"), true, mustIP("127.1.2.3")},
|
||||||
{mustIP("0:0:0:0:0000:ffff:127.1.2.3"), true, mustIP("127.1.2.3")},
|
{mustIP("0:0:0:0:0000:ffff:127.1.2.3"), true, mustIP("127.1.2.3")},
|
||||||
{mustIP("0:0:0:0:000000:ffff:127.1.2.3"), true, mustIP("127.1.2.3")},
|
|
||||||
{mustIP("0:0:0:0::ffff:127.1.2.3"), true, mustIP("127.1.2.3")},
|
{mustIP("0:0:0:0::ffff:127.1.2.3"), true, mustIP("127.1.2.3")},
|
||||||
{mustIP("::1"), false, mustIP("::1")},
|
{mustIP("::1"), false, mustIP("::1")},
|
||||||
{mustIP("1.2.3.4"), false, mustIP("1.2.3.4")},
|
{mustIP("1.2.3.4"), false, mustIP("1.2.3.4")},
|
||||||
|
@ -182,6 +182,9 @@ func parseIPv4Slow(s string) (Addr, error) {
|
|||||||
// parseWord converts a 16-bit hex string into its corresponding
|
// parseWord converts a 16-bit hex string into its corresponding
|
||||||
// two-byte value.
|
// two-byte value.
|
||||||
func parseWord(s string) (byte, byte, error) {
|
func parseWord(s string) (byte, byte, error) {
|
||||||
|
if(len(s) > 4) {
|
||||||
|
return 0, 0, fmt.Errorf("parseWord(%q): invalid word", s)
|
||||||
|
}
|
||||||
ret, err := strconv.ParseUint(s, 16, 16)
|
ret, err := strconv.ParseUint(s, 16, 16)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, 0, err
|
return 0, 0, err
|
||||||
|
Loading…
Reference in New Issue
Block a user