From 37257404a56bfe609b43d9969933a2d9d478a5d7 Mon Sep 17 00:00:00 2001 From: Brian Pursley Date: Thu, 5 Mar 2026 18:41:52 -0500 Subject: [PATCH] Check wait condition type cast to avoid potential panic --- .../k8s.io/kubectl/pkg/cmd/wait/condition.go | 5 ++- .../k8s.io/kubectl/pkg/cmd/wait/wait_test.go | 44 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/wait/condition.go b/staging/src/k8s.io/kubectl/pkg/cmd/wait/condition.go index 26e4b108080..0497a21aea6 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/wait/condition.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/wait/condition.go @@ -59,7 +59,10 @@ func (w ConditionalWait) checkCondition(obj *unstructured.Unstructured) (bool, e return false, nil } for _, conditionUncast := range conditions { - condition := conditionUncast.(map[string]interface{}) + condition, ok := conditionUncast.(map[string]interface{}) + if !ok { + continue + } name, found, err := unstructured.NestedString(condition, "type") if !found || err != nil || !strings.EqualFold(name, w.conditionName) { continue diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/wait/wait_test.go b/staging/src/k8s.io/kubectl/pkg/cmd/wait/wait_test.go index 37d127c1bcc..48cbe901f4d 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/wait/wait_test.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/wait/wait_test.go @@ -1924,3 +1924,47 @@ func TestWaitForMultipleConditions(t *testing.T) { }) } } + +func TestConditionalWaitCheckConditionHandlesMalformedConditions(t *testing.T) { + tests := []struct { + name string + conditions []interface{} + expectMet bool + }{ + { + name: "single malformed condition item", + conditions: []interface{}{ + "not-a-map", + }, + expectMet: false, + }, + { + name: "malformed condition followed by matching condition", + conditions: []interface{}{ + "not-a-map", + map[string]interface{}{ + "type": "Ready", + "status": "True", + }, + }, + expectMet: true, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + obj := newUnstructured("group/version", "TheKind", "ns-foo", "name-foo") + require.NoError(t, unstructured.SetNestedSlice(obj.Object, tc.conditions, "status", "conditions")) + + w := ConditionalWait{ + conditionName: "Ready", + conditionStatus: "True", + errOut: io.Discard, + } + + met, err := w.checkCondition(obj) + require.NoError(t, err) + require.Equal(t, tc.expectMet, met) + }) + } +}