From 52b58b88a68854fede7bd1693f953cdbfaead423 Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Tue, 4 Apr 2017 21:13:00 -0500 Subject: [PATCH] Fix pgtype.Inet.AssignTo assigning reference AssignTo should always assign copy. Added documentation for AssignTo interface. --- pgtype/inet.go | 10 ++++++++-- pgtype/pgtype.go | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) 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 }