diff options
author | Adam Langley <agl@golang.org> | 2010-01-11 18:54:13 -0800 |
---|---|---|
committer | Adam Langley <agl@golang.org> | 2010-01-11 18:54:13 -0800 |
commit | e7cceb85e45e01d58d740de1adc111c08dd9d9de (patch) | |
tree | e88ff3f7b70489b7689eb5430e4779b8df48db75 | |
parent | 72b97e46a3b76ac4a7bed3d0c11bcb298e9c3bea (diff) | |
download | go-e7cceb85e45e01d58d740de1adc111c08dd9d9de.tar.gz go-e7cceb85e45e01d58d740de1adc111c08dd9d9de.zip |
asn1: fix marshaling of structures with >1 elements.
Fixes #515.
R=rsc
CC=golang-dev
https://golang.org/cl/184079
-rw-r--r-- | src/pkg/asn1/marshal.go | 9 | ||||
-rw-r--r-- | src/pkg/asn1/marshal_test.go | 6 |
2 files changed, 13 insertions, 2 deletions
diff --git a/src/pkg/asn1/marshal.go b/src/pkg/asn1/marshal.go index eec0ee8494..40a52b6624 100644 --- a/src/pkg/asn1/marshal.go +++ b/src/pkg/asn1/marshal.go @@ -29,6 +29,9 @@ func newForkableWriter() *forkableWriter { } func (f *forkableWriter) fork() (pre, post *forkableWriter) { + if f.pre != nil || f.post != nil { + panic("have already forked") + } f.pre = newForkableWriter() f.post = newForkableWriter() return f.pre, f.post @@ -61,7 +64,7 @@ func (f *forkableWriter) writeTo(out io.Writer) (n int, err os.Error) { } } - if f.pre != nil { + if f.post != nil { nn, err = f.post.writeTo(out) n += nn } @@ -297,7 +300,9 @@ func marshalBody(out *forkableWriter, value reflect.Value, params fieldParameter case *reflect.StructValue: t := v.Type().(*reflect.StructType) for i := 0; i < t.NumField(); i++ { - err = marshalField(out, v.Field(i), parseFieldParameters(t.Field(i).Tag)) + var pre *forkableWriter + pre, out = out.fork() + err = marshalField(pre, v.Field(i), parseFieldParameters(t.Field(i).Tag)) if err != nil { return } diff --git a/src/pkg/asn1/marshal_test.go b/src/pkg/asn1/marshal_test.go index 2bb8a28d9c..da4a03c041 100644 --- a/src/pkg/asn1/marshal_test.go +++ b/src/pkg/asn1/marshal_test.go @@ -15,6 +15,11 @@ type intStruct struct { A int } +type twoIntStruct struct { + A int + B int +} + type nestedStruct struct { A intStruct } @@ -48,6 +53,7 @@ func setPST(t *time.Time) *time.Time { var marshalTests = []marshalTest{ marshalTest{10, "02010a"}, marshalTest{intStruct{64}, "3003020140"}, + marshalTest{twoIntStruct{64, 65}, "3006020140020141"}, marshalTest{nestedStruct{intStruct{127}}, "3005300302017f"}, marshalTest{[]byte{1, 2, 3}, "0403010203"}, marshalTest{implicitTagTest{64}, "3003850140"}, |