diff --git a/changes/issue-7420-config-panics b/changes/issue-7420-config-panics new file mode 100644 index 0000000000..71205a1a44 --- /dev/null +++ b/changes/issue-7420-config-panics @@ -0,0 +1 @@ +* Fixed a server panic happening when a team was edited via yaml without an `agent_options` key. diff --git a/server/datastore/cached_mysql/cached_mysql.go b/server/datastore/cached_mysql/cached_mysql.go index 4d42366ce8..a6de180ae1 100644 --- a/server/datastore/cached_mysql/cached_mysql.go +++ b/server/datastore/cached_mysql/cached_mysql.go @@ -35,6 +35,10 @@ func clone(v interface{}) (interface{}, error) { return cloner.Clone() } + if v == nil { + return nil, nil + } + // Use reflection to initialize a clone of v of the same type. vv := reflect.ValueOf(v) @@ -43,6 +47,9 @@ func clone(v interface{}) (interface{}, error) { isPtr := false if vv.Kind() == reflect.Ptr { isPtr = true + if vv.IsNil() { + return nil, nil + } vv = vv.Elem() } diff --git a/server/datastore/cached_mysql/cached_mysql_test.go b/server/datastore/cached_mysql/cached_mysql_test.go index 391e8f99cf..37d94b9aff 100644 --- a/server/datastore/cached_mysql/cached_mysql_test.go +++ b/server/datastore/cached_mysql/cached_mysql_test.go @@ -15,6 +15,8 @@ import ( ) func TestClone(t *testing.T) { + var nilRawMessage *json.RawMessage + tests := []struct { name string src interface{} @@ -61,6 +63,16 @@ func TestClone(t *testing.T) { src: &[]string{"foo", "bar"}, want: &[]string{"foo", "bar"}, }, + { + name: "nil", + src: nil, + want: nil, + }, + { + name: "nil pointer", + src: nilRawMessage, + want: nil, + }, } for _, tc := range tests {