diff options
author | Michal Bohuslávek <mbohuslavek@gmail.com> | 2015-08-26 13:49:22 +0200 |
---|---|---|
committer | Adam Langley <agl@golang.org> | 2015-08-29 18:53:41 +0000 |
commit | fac1039615b7f252c38317ce5069d35b45da3cef (patch) | |
tree | 7bc74173adc18b5f01579f99b13e816125066088 /src/encoding/asn1 | |
parent | 805e56ef474a8abfc4ec4159bea0c1fb584e67ed (diff) | |
download | go-fac1039615b7f252c38317ce5069d35b45da3cef.tar.gz go-fac1039615b7f252c38317ce5069d35b45da3cef.zip |
encoding/asn1: fix panic when Marshaling nil.
Fixes #11127.
Change-Id: Ibcfc3a05e91fa4260d70b04bee2bbba2376bd313
Reviewed-on: https://go-review.googlesource.com/13923
Reviewed-by: Adam Langley <agl@golang.org>
Diffstat (limited to 'src/encoding/asn1')
-rw-r--r-- | src/encoding/asn1/asn1_test.go | 12 | ||||
-rw-r--r-- | src/encoding/asn1/marshal.go | 3 |
2 files changed, 15 insertions, 0 deletions
diff --git a/src/encoding/asn1/asn1_test.go b/src/encoding/asn1/asn1_test.go index 893d0801b0..3be4de9c8e 100644 --- a/src/encoding/asn1/asn1_test.go +++ b/src/encoding/asn1/asn1_test.go @@ -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) + } + } +} diff --git a/src/encoding/asn1/marshal.go b/src/encoding/asn1/marshal.go index c901963186..1bcb9b31a4 100644 --- a/src/encoding/asn1/marshal.go +++ b/src/encoding/asn1/marshal.go @@ -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) |