diff options
author | Oleksandr Redko <oleksandr.red+github@gmail.com> | 2024-03-29 15:11:50 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-29 14:11:50 +0100 |
commit | e28be0c9931e98f797c662a805058e3d791fe3f5 (patch) | |
tree | 3bf1bde0d45266f886879b68bd324c1723618481 | |
parent | test: remove redundant error check (#1741) (diff) | |
download | fasthttp-e28be0c9931e98f797c662a805058e3d791fe3f5.tar.gz fasthttp-e28be0c9931e98f797c662a805058e3d791fe3f5.tar.bz2 fasthttp-e28be0c9931e98f797c662a805058e3d791fe3f5.zip |
fix: panic in ParseIPv4 when len(dst) > 4 (#1742)
-rw-r--r-- | bytesconv.go | 8 | ||||
-rw-r--r-- | bytesconv_test.go | 24 |
2 files changed, 17 insertions, 15 deletions
diff --git a/bytesconv.go b/bytesconv.go index 4e36d1d..dddf24f 100644 --- a/bytesconv.go +++ b/bytesconv.go @@ -73,15 +73,11 @@ func ParseIPv4(dst net.IP, ipStr []byte) (net.IP, error) { if len(ipStr) == 0 { return dst, errEmptyIPStr } - if len(dst) < net.IPv4len { + if len(dst) < net.IPv4len || len(dst) > net.IPv4len { dst = make([]byte, net.IPv4len) } copy(dst, net.IPv4zero) - dst = dst.To4() - if dst == nil { - // developer sanity-check - panic("BUG: dst must not be nil") - } + dst = dst.To4() // dst is always non-nil here b := ipStr for i := 0; i < 3; i++ { diff --git a/bytesconv_test.go b/bytesconv_test.go index 54e5e20..d5ca5e4 100644 --- a/bytesconv_test.go +++ b/bytesconv_test.go @@ -59,21 +59,27 @@ func testAppendHTMLEscape(t *testing.T, s, expectedS string) { func TestParseIPv4(t *testing.T) { t.Parallel() - testParseIPv4(t, "0.0.0.0", true) - testParseIPv4(t, "255.255.255.255", true) - testParseIPv4(t, "123.45.67.89", true) + testParseIPv4(t, net.IP{0}, "0.0.0.0", true) + testParseIPv4(t, nil, "0.0.0.0", true) + testParseIPv4(t, net.IP{0, 0, 0, 0, 0}, "0.0.0.0", true) + testParseIPv4(t, nil, "255.255.255.255", true) + testParseIPv4(t, nil, "123.45.67.89", true) // ipv6 shouldn't work - testParseIPv4(t, "2001:4860:0:2001::68", false) + testParseIPv4(t, nil, "2001:4860:0:2001::68", false) // invalid ip - testParseIPv4(t, "foobar", false) - testParseIPv4(t, "1.2.3", false) - testParseIPv4(t, "123.456.789.11", false) + testParseIPv4(t, nil, "", false) + testParseIPv4(t, nil, "foobar", false) + testParseIPv4(t, nil, "1.2.3", false) + testParseIPv4(t, nil, "123.456.789.11", false) + testParseIPv4(t, nil, "b.1.2.3", false) + testParseIPv4(t, nil, "1.2.3.b", false) + testParseIPv4(t, nil, "1.2.3.456", false) } -func testParseIPv4(t *testing.T, ipStr string, isValid bool) { - ip, err := ParseIPv4(nil, []byte(ipStr)) +func testParseIPv4(t *testing.T, dst net.IP, ipStr string, isValid bool) { + ip, err := ParseIPv4(dst, []byte(ipStr)) if isValid { if err != nil { t.Fatalf("unexpected error when parsing ip %q: %v", ipStr, err) |