aboutsummaryrefslogtreecommitdiff
path: root/src/encoding/asn1
diff options
context:
space:
mode:
authorMichal Bohuslávek <mbohuslavek@gmail.com>2015-08-26 13:49:22 +0200
committerAdam Langley <agl@golang.org>2015-08-29 18:53:41 +0000
commitfac1039615b7f252c38317ce5069d35b45da3cef (patch)
tree7bc74173adc18b5f01579f99b13e816125066088 /src/encoding/asn1
parent805e56ef474a8abfc4ec4159bea0c1fb584e67ed (diff)
downloadgo-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.go12
-rw-r--r--src/encoding/asn1/marshal.go3
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)