From: Michal Bohuslávek Date: Wed, 26 Aug 2015 11:49:22 +0000 (+0200) Subject: encoding/asn1: fix panic when Marshaling nil. X-Git-Tag: go1.6beta1~1235 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=fac1039615b7f252c38317ce5069d35b45da3cef;p=gostls13.git encoding/asn1: fix panic when Marshaling nil. Fixes #11127. Change-Id: Ibcfc3a05e91fa4260d70b04bee2bbba2376bd313 Reviewed-on: https://go-review.googlesource.com/13923 Reviewed-by: Adam Langley --- 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)