]> Cypherpunks repositories - gostls13.git/commitdiff
asn1: fix marshaling of structures with >1 elements.
authorAdam Langley <agl@golang.org>
Tue, 12 Jan 2010 02:54:13 +0000 (18:54 -0800)
committerAdam Langley <agl@golang.org>
Tue, 12 Jan 2010 02:54:13 +0000 (18:54 -0800)
Fixes #515.

R=rsc
CC=golang-dev
https://golang.org/cl/184079

src/pkg/asn1/marshal.go
src/pkg/asn1/marshal_test.go

index eec0ee84943fa08f28b31d8a29529f1b845cacf6..40a52b6624b68bca62fd029cc7e01729ce38d48f 100644 (file)
@@ -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
                        }
index 2bb8a28d9ccefc6821829a7ae0c1bfc0fb897854..da4a03c0414221554555b3fea9d296adbfed4070 100644 (file)
@@ -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"},