From b00222082e4e3dd8f6e649b2a525aaada5f03da8 Mon Sep 17 00:00:00 2001 From: Maxim Korolyov Date: Tue, 18 Jun 2019 20:45:05 +0300 Subject: [PATCH 1/2] fix unmarshal for array of poiners --- bson/bson_test.go | 3 +++ bson/decode.go | 13 +++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/bson/bson_test.go b/bson/bson_test.go index 11fdfae41..8c3271388 100644 --- a/bson/bson_test.go +++ b/bson/bson_test.go @@ -1308,6 +1308,9 @@ var twoWayCrossItems = []crossTypeItem{ // arrays {&struct{ V [2]int }{[...]int{1, 2}}, map[string][2]int{"v": [2]int{1, 2}}}, {&struct{ V [2]byte }{[...]byte{1, 2}}, map[string][2]byte{"v": [2]byte{1, 2}}}, + {&struct{ V *[2]byte }{&[...]byte{1, 2}}, map[string]*[2]byte{"v": &[2]byte{1, 2}}}, + {&struct{ V [2]float64 }{[...]float64{1, 2}}, map[string][2]float64{"v": [2]float64{1, 2}}}, + {&struct{ V *[2]float64 }{&[...]float64{1, 2}}, map[string]*[2]float64{"v": &[2]float64{1, 2}}}, // zero time {&struct{ V time.Time }{}, map[string]interface{}{"v": time.Time{}}}, diff --git a/bson/decode.go b/bson/decode.go index fd29da450..c3197fd22 100644 --- a/bson/decode.go +++ b/bson/decode.go @@ -297,8 +297,17 @@ func (d *decoder) readArrayDocTo(out reflect.Value) { if end <= d.i || end > len(d.in) || d.in[end-1] != '\x00' { corrupted() } + + array := out + if out.Kind() == reflect.Ptr { + p := reflect.New(out.Type()) + tmp := reflect.New(p.Elem().Type().Elem()) + out.Set(tmp) + array = tmp.Elem() + } + i := 0 - l := out.Len() + l := array.Len() for d.in[d.i] != '\x00' { if i >= l { panic("Length mismatch on array field") @@ -311,7 +320,7 @@ func (d *decoder) readArrayDocTo(out reflect.Value) { corrupted() } d.i++ - d.readElemTo(out.Index(i), kind) + d.readElemTo(array.Index(i), kind) if d.i >= end { corrupted() } From ddbadd476bd16c92efc0ade0270551f621935941 Mon Sep 17 00:00:00 2001 From: Maxim Korolyov Date: Tue, 18 Jun 2019 23:57:08 +0300 Subject: [PATCH 2/2] added go mod --- go.mod | 12 ++++++++++++ go.sum | 24 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 go.mod create mode 100644 go.sum diff --git a/go.mod b/go.mod new file mode 100644 index 000000000..5e34229cf --- /dev/null +++ b/go.mod @@ -0,0 +1,12 @@ +module github.com/mkorolyov/mgo + +require ( + github.com/kr/pretty v0.1.0 // indirect + github.com/xdg/stringprep v1.0.0 + golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 // indirect + golang.org/x/text v0.3.2 // indirect + gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 + gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce + gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 + gopkg.in/yaml.v2 v2.2.2 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 000000000..4347254ab --- /dev/null +++ b/go.sum @@ -0,0 +1,24 @@ +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0= +github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637 h1:yiW+nvdHb9LVqSHQBXfZCieqV4fzYhNBql77zY0ykqs= +gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637/go.mod h1:BHsqpu/nsuzkT5BpiH1EMZPLyqSMM8JbIavyFACoFNk= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=