From e92478ec70e12ec4c64ca707d32dc41b164ee6b8 Mon Sep 17 00:00:00 2001 From: Tomas Volf Date: Tue, 13 Oct 2020 15:26:09 +0200 Subject: [PATCH] Fix Inet.Set to handle nil net.IP correctly When nil IP is returned from net.ParseIP, it is accepted into Inet type, but not properly marked as being Null. That introduces issues later on when calling for example EncodeBinary, since it does not assume this can happen. This commit resolves that by properly detecting zero-length net.IP and setting status to Null if that is the case. --- inet.go | 10 +++++++--- inet_test.go | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/inet.go b/inet.go index f3dce87b..b4498191 100644 --- a/inet.go +++ b/inet.go @@ -38,9 +38,13 @@ func (dst *Inet) Set(src interface{}) error { case net.IPNet: *dst = Inet{IPNet: &value, Status: Present} case net.IP: - bitCount := len(value) * 8 - mask := net.CIDRMask(bitCount, bitCount) - *dst = Inet{IPNet: &net.IPNet{Mask: mask, IP: value}, Status: Present} + if len(value) == 0 { + *dst = Inet{Status: Null} + } else { + bitCount := len(value) * 8 + mask := net.CIDRMask(bitCount, bitCount) + *dst = Inet{IPNet: &net.IPNet{Mask: mask, IP: value}, Status: Present} + } case string: _, ipnet, err := net.ParseCIDR(value) if err != nil { diff --git a/inet_test.go b/inet_test.go index 8257a63d..cb420a51 100644 --- a/inet_test.go +++ b/inet_test.go @@ -35,6 +35,7 @@ func TestInetSet(t *testing.T) { {source: mustParseCIDR(t, "127.0.0.1/32"), result: pgtype.Inet{IPNet: mustParseCIDR(t, "127.0.0.1/32"), Status: pgtype.Present}}, {source: mustParseCIDR(t, "127.0.0.1/32").IP, result: pgtype.Inet{IPNet: mustParseCIDR(t, "127.0.0.1/32"), Status: pgtype.Present}}, {source: "127.0.0.1/32", result: pgtype.Inet{IPNet: mustParseCIDR(t, "127.0.0.1/32"), Status: pgtype.Present}}, + {source: net.ParseIP(""), result: pgtype.Inet{Status: pgtype.Null}}, } for i, tt := range successfulTests {