From 6858a24835721cae6968ad85cdf4985afaa03923 Mon Sep 17 00:00:00 2001 From: Davanum Srinivas Date: Fri, 4 Jan 2019 11:22:46 -0500 Subject: [PATCH] Strengthen ErrorToAPIStatus against bad input Change-Id: Id44a59f56c074901257760ff4e40ce29820c6c50 --- .../endpoints/handlers/responsewriters/status.go | 15 +++++++++++---- .../handlers/responsewriters/status_test.go | 13 +++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/status.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/status.go index 99673077b2b..5a845435033 100755 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/status.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/status.go @@ -38,11 +38,18 @@ func ErrorToAPIStatus(err error) *metav1.Status { if len(status.Status) == 0 { status.Status = metav1.StatusFailure } - if status.Code == 0 { - switch status.Status { - case metav1.StatusSuccess: + switch status.Status { + case metav1.StatusSuccess: + if status.Code == 0 { status.Code = http.StatusOK - case metav1.StatusFailure: + } + case metav1.StatusFailure: + if status.Code == 0 { + status.Code = http.StatusInternalServerError + } + default: + runtime.HandleError(fmt.Errorf("apiserver received an error with wrong status field : %#+v", err)) + if status.Code == 0 { status.Code = http.StatusInternalServerError } } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/status_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/status_test.go index b4a8bf42c78..9e1d37bd2b2 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/status_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters/status_test.go @@ -27,6 +27,19 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" ) +func TestBadStatusErrorToAPIStatus(t *testing.T) { + err := errors.StatusError{} + actual := ErrorToAPIStatus(&err) + expected := &metav1.Status{ + TypeMeta: metav1.TypeMeta{Kind: "Status", APIVersion: "v1"}, + Status: metav1.StatusFailure, + Code: 500, + } + if !reflect.DeepEqual(actual, expected) { + t.Errorf("%s: Expected %#v, Got %#v", actual, expected, actual) + } +} + func TestAPIStatus(t *testing.T) { cases := map[error]metav1.Status{ errors.NewNotFound(schema.GroupResource{Group: "legacy.kubernetes.io", Resource: "foos"}, "bar"): {