]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/asn1: fix panic when Marshaling nil.
authorMichal Bohuslávek <mbohuslavek@gmail.com>
Wed, 26 Aug 2015 11:49:22 +0000 (13:49 +0200)
committerAdam Langley <agl@golang.org>
Sat, 29 Aug 2015 18:53:41 +0000 (18:53 +0000)
Fixes #11127.

Change-Id: Ibcfc3a05e91fa4260d70b04bee2bbba2376bd313
Reviewed-on: https://go-review.googlesource.com/13923
Reviewed-by: Adam Langley <agl@golang.org>
src/encoding/asn1/asn1_test.go
src/encoding/asn1/marshal.go

index 893d0801b00308ffd935d6d26426631fe3e9efc6..3be4de9c8ee13f20708c0f7a21b5cff44299d773 100644 (file)
@@ -940,3 +940,15 @@ func TestUnmarshalInvalidUTF8(t *testing.T) {
                t.Fatalf("Expected error to mention %q but error was %q", expectedSubstring, err.Error())
        }
 }
+
+func TestMarshalNilValue(t *testing.T) {
+       nilValueTestData := []interface{}{
+               nil,
+               struct{ v interface{} }{},
+       }
+       for i, test := range nilValueTestData {
+               if _, err := Marshal(test); err == nil {
+                       t.Fatal("#%d: successfully marshaled nil value", i)
+               }
+       }
+}
index c90196318651dc7bbcb7a83f6b4ecf0097846015..1bcb9b31a4818c6d28b5e23a17c58df3be303cb2 100644 (file)
@@ -506,6 +506,9 @@ func marshalBody(out *forkableWriter, value reflect.Value, params fieldParameter
 }
 
 func marshalField(out *forkableWriter, v reflect.Value, params fieldParameters) (err error) {
+       if !v.IsValid() {
+               return fmt.Errorf("asn1: cannot marshal nil value")
+       }
        // If the field is an interface{} then recurse into it.
        if v.Kind() == reflect.Interface && v.Type().NumMethod() == 0 {
                return marshalField(out, v.Elem(), params)