From 6c2556c5c42c23209e5327f0fabd79d65ff69f9f Mon Sep 17 00:00:00 2001 From: Sergey Kanzhelev Date: Fri, 16 Oct 2020 21:13:49 +0000 Subject: [PATCH] The function shouldRecordEvent will panic when the value of input object is nil --- pkg/kubelet/container/helpers.go | 7 ++++--- pkg/kubelet/container/helpers_test.go | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/pkg/kubelet/container/helpers.go b/pkg/kubelet/container/helpers.go index 45e003bbc9da..4b207b99d848 100644 --- a/pkg/kubelet/container/helpers.go +++ b/pkg/kubelet/container/helpers.go @@ -191,10 +191,11 @@ type innerEventRecorder struct { } func (irecorder *innerEventRecorder) shouldRecordEvent(object runtime.Object) (*v1.ObjectReference, bool) { - if object == nil { - return nil, false - } if ref, ok := object.(*v1.ObjectReference); ok { + // this check is needed AFTER the cast. See https://github.com/kubernetes/kubernetes/issues/95552 + if ref == nil { + return nil, false + } if !strings.HasPrefix(ref.FieldPath, ImplicitContainerPrefix) { return ref, true } diff --git a/pkg/kubelet/container/helpers_test.go b/pkg/kubelet/container/helpers_test.go index bcb49adfcd8d..42baf048008a 100644 --- a/pkg/kubelet/container/helpers_test.go +++ b/pkg/kubelet/container/helpers_test.go @@ -676,3 +676,26 @@ func TestHashContainer(t *testing.T) { assert.Equal(t, tc.expectedHash, hashVal, "the hash value here should not be changed.") } } + +func TestShouldRecordEvent(t *testing.T) { + var innerEventRecorder = &innerEventRecorder{ + recorder: nil, + } + + _, actual := innerEventRecorder.shouldRecordEvent(nil) + assert.Equal(t, false, actual) + + var obj = &v1.ObjectReference{Namespace: "claimrefns", Name: "claimrefname"} + + _, actual = innerEventRecorder.shouldRecordEvent(obj) + assert.Equal(t, true, actual) + + obj = &v1.ObjectReference{Namespace: "system", Name: "infra", FieldPath: "implicitly required container "} + + _, actual = innerEventRecorder.shouldRecordEvent(obj) + assert.Equal(t, false, actual) + + var nilObj *v1.ObjectReference = nil + _, actual = innerEventRecorder.shouldRecordEvent(nilObj) + assert.Equal(t, false, actual, "should not panic if the typed nil was used, see https://github.com/kubernetes/kubernetes/issues/95552") +}