diff --git a/pgtype/inet.go b/pgtype/inet.go index 0ca3ee7a..3e00e2fa 100644 --- a/pgtype/inet.go +++ b/pgtype/inet.go @@ -70,13 +70,19 @@ func (src *Inet) AssignTo(dst interface{}) error { case Present: switch v := dst.(type) { case *net.IPNet: - *v = *src.IPNet + *v = net.IPNet{ + IP: make(net.IP, len(src.IPNet.IP)), + Mask: make(net.IPMask, len(src.IPNet.Mask)), + } + copy(v.IP, src.IPNet.IP) + copy(v.Mask, src.IPNet.Mask) return nil case *net.IP: if oneCount, bitCount := src.IPNet.Mask.Size(); oneCount != bitCount { return fmt.Errorf("cannot assign %v to %T", src, dst) } - *v = src.IPNet.IP + *v = make(net.IP, len(src.IPNet.IP)) + copy(*v, src.IPNet.IP) return nil default: if nextDst, retry := GetAssignToDstType(dst); retry { diff --git a/pgtype/pgtype.go b/pgtype/pgtype.go index 6b06539b..5de07b7d 100644 --- a/pgtype/pgtype.go +++ b/pgtype/pgtype.go @@ -89,7 +89,8 @@ type Value interface { // possible, then Get() returns Value. Get() interface{} - // AssignTo converts and assigns the Value to dst. + // AssignTo converts and assigns the Value to dst. It MUST make a deep copy of + // any reference types. AssignTo(dst interface{}) error }