From 7671e4ea8b4544110bf41b85d819ac66959efbd8 Mon Sep 17 00:00:00 2001
From: Thorsten Riess
Date: Fri, 21 May 2021 14:28:27 +0200
Subject: [PATCH] Fix panic if there is a nil in a map[...]interface{} value
---
convert.go | 17 +++++++++++++++++
convert_test.go | 15 +++++++++++++++
2 files changed, 32 insertions(+)
diff --git a/convert.go b/convert.go
index bd6523e..6c0c3b6 100644
--- a/convert.go
+++ b/convert.go
@@ -177,6 +177,9 @@ func (ce *ConverterEngine) Convert(source interface{}, targetType reflect.Type)
if ok {
return kind2Exact(stringer.String(), targetType), nil
}
+ if sourceType == nil {
+ return kind2Exact("", targetType), nil
+ }
// Convert to string typical value types
switch sourceType.Kind() {
case reflect.Bool:
@@ -191,6 +194,20 @@ func (ce *ConverterEngine) Convert(source interface{}, targetType reflect.Type)
}
+ if sourceType == nil {
+ switch targetType.Kind() {
+ case reflect.String:
+ return kind2Exact("", targetType), nil
+ case reflect.Bool:
+ return kind2Exact(false, targetType), nil
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return kind2Exact(0, targetType), nil
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ return kind2Exact(0, targetType), nil
+ case reflect.Float32, reflect.Float64:
+ return kind2Exact(0.0, targetType), nil
+ }
+ }
if sourceType.Kind() == reflect.String {
// Attempt to parse typical value types from the string
switch targetType.Kind() {
diff --git a/convert_test.go b/convert_test.go
index 82ad32f..9de829e 100644
--- a/convert_test.go
+++ b/convert_test.go
@@ -105,19 +105,34 @@ var testData = []ConversionTest{
"uno": 1,
"dos": 2,
"tres": 3,
+ "nil": nil,
}, map[string]int{
"uno": 1,
"dos": 2,
"tres": 3,
+ "nil": 0,
}, nil},
{map[string]interface{}{
"1": "uno",
"2": "dos",
"3": "tres",
+ "4": nil,
}, map[int]string{
1: "uno",
2: "dos",
3: "tres",
+ 4: "",
+ }, nil},
+ {map[string]interface{}{
+ "uno": 1,
+ "dos": 2,
+ "tres": 3,
+ "nil": nil,
+ }, map[string]int{
+ "uno": 1,
+ "dos": 2,
+ "tres": 3,
+ "nil": 0,
}, nil},
{[]byte{65, 66, 67, 0}, "ABC\x00", nil},
{"ABC\x00", []byte{65, 66, 67, 0}, nil},