diff --git a/pkg/conversion/meta.go b/pkg/conversion/meta.go index d82968bae8..0875f886c2 100644 --- a/pkg/conversion/meta.go +++ b/pkg/conversion/meta.go @@ -113,7 +113,10 @@ func UpdateVersionAndKind(baseFields []string, versionField, version, kindField, func EnforcePtr(obj interface{}) (reflect.Value, error) { v := reflect.ValueOf(obj) if v.Kind() != reflect.Ptr { - return reflect.Value{}, fmt.Errorf("expected pointer, but got %v", v.Type().Name()) + if v.Kind() == reflect.Invalid { + return reflect.Value{}, fmt.Errorf("expected pointer, but got invalid kind") + } + return reflect.Value{}, fmt.Errorf("expected pointer, but got %v type", v.Type().Name()) } return v.Elem(), nil } diff --git a/pkg/conversion/meta_test.go b/pkg/conversion/meta_test.go index b4c6c0771b..d2e359275d 100644 --- a/pkg/conversion/meta_test.go +++ b/pkg/conversion/meta_test.go @@ -242,3 +242,14 @@ func TestMetaValuesUnregisteredConvert(t *testing.T) { t.Errorf("Expected %v, got %v", e, a) } } + +func TestInvalidPtrValueKind(t *testing.T) { + var simple interface{} + switch obj := simple.(type) { + default: + _, err := EnforcePtr(obj) + if err == nil { + t.Errorf("Expected error on invalid kind") + } + } +} diff --git a/pkg/runtime/scheme_test.go b/pkg/runtime/scheme_test.go index 42b7531170..dd5a59418a 100644 --- a/pkg/runtime/scheme_test.go +++ b/pkg/runtime/scheme_test.go @@ -123,6 +123,20 @@ func TestScheme(t *testing.T) { } } +func TestInvalidObjectValueKind(t *testing.T) { + scheme := runtime.NewScheme() + scheme.AddKnownTypeWithName("", "Simple", &InternalSimple{}) + + embedded := &runtime.EmbeddedObject{} + switch obj := embedded.Object.(type) { + default: + _, _, err := scheme.ObjectVersionAndKind(obj) + if err == nil { + t.Errorf("Expected error on invalid kind") + } + } +} + func TestBadJSONRejection(t *testing.T) { scheme := runtime.NewScheme() badJSONMissingKind := []byte(`{ }`)