Skip to content

Commit 58ad8a0

Browse files
jyh071116k8s-publishing-bot
authored andcommitted
Fix nil pointer dereference in selectable fields check When checking specVersion.SelectableFields, if specVersion is nil, a nil pointer dereference could occur. This change updates the conditional to use || instead of &&, ensuring that the check for specVersion being nil happens first, avoiding potential runtime panics.
Additionally, a new test case has been added to validate this condition, ensuring safe handling of nil values for specVersion and empty SelectableFields. Signed-off-by: pirates <[email protected]> Kubernetes-commit: 4fd08097171398a5f1d69a9ec19db2773c1d49d4
1 parent 6ca85ae commit 58ad8a0

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

pkg/controller/openapi/builder/builder.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ func buildSelectableFields(crd *apiextensionsv1.CustomResourceDefinition, versio
623623
break
624624
}
625625
}
626-
if specVersion == nil && len(specVersion.SelectableFields) == 0 {
626+
if specVersion == nil || len(specVersion.SelectableFields) == 0 {
627627
return nil
628628
}
629629
selectableFields := make([]any, len(specVersion.SelectableFields))

pkg/controller/openapi/builder/builder_test.go

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,31 +45,41 @@ func TestNewBuilder(t *testing.T) {
4545
wantedSchema string
4646
wantedItemsSchema string
4747

48-
v2 bool // produce OpenAPIv2
48+
v2 bool // produce OpenAPIv2
49+
includeSelectable bool // include selectable fields
50+
version string
4951
}{
5052
{
5153
"nil",
5254
"",
5355
`{"type":"object","x-kubernetes-group-version-kind":[{"group":"bar.k8s.io","kind":"Foo","version":"v1"}]}`, `{"$ref":"#/definitions/io.k8s.bar.v1.Foo"}`,
5456
true,
57+
false,
58+
"v1",
5559
},
5660
{"with properties",
5761
`{"type":"object","properties":{"spec":{"type":"object"},"status":{"type":"object"}}}`,
5862
`{"type":"object","properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"metadata":{"$ref":"#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"},"spec":{"type":"object"},"status":{"type":"object"}},"x-kubernetes-group-version-kind":[{"group":"bar.k8s.io","kind":"Foo","version":"v1"}]}`,
5963
`{"$ref":"#/definitions/io.k8s.bar.v1.Foo"}`,
6064
true,
65+
false,
66+
"v1",
6167
},
6268
{"type only",
6369
`{"type":"object"}`,
6470
`{"type":"object","properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"metadata":{"$ref":"#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"}},"x-kubernetes-group-version-kind":[{"group":"bar.k8s.io","kind":"Foo","version":"v1"}]}`,
6571
`{"$ref":"#/definitions/io.k8s.bar.v1.Foo"}`,
6672
true,
73+
false,
74+
"v1",
6775
},
6876
{"preserve unknown at root v2",
6977
`{"type":"object","x-kubernetes-preserve-unknown-fields":true}`,
7078
`{"type":"object","x-kubernetes-group-version-kind":[{"group":"bar.k8s.io","kind":"Foo","version":"v1"}]}`,
7179
`{"$ref":"#/definitions/io.k8s.bar.v1.Foo"}`,
7280
true,
81+
false,
82+
"v1",
7383
},
7484
{"with extensions",
7585
`
@@ -173,6 +183,17 @@ func TestNewBuilder(t *testing.T) {
173183
}`,
174184
`{"$ref":"#/definitions/io.k8s.bar.v1.Foo"}`,
175185
true,
186+
false,
187+
"v1",
188+
},
189+
{
190+
"include selectable fields with different version",
191+
`{"type":"object","properties":{"spec":{"type":"object"},"status":{"type":"object"}}}`,
192+
`{"type":"object","properties":{"apiVersion":{"type":"string"},"kind":{"type":"string"},"metadata":{"$ref":"#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta"},"spec":{"type":"object"},"status":{"type":"object"}},"x-kubernetes-group-version-kind":[{"group":"bar.k8s.io","kind":"Foo","version":"v2"}]}`,
193+
`{"$ref":"#/definitions/io.k8s.bar.v2.Foo"}`,
194+
true,
195+
true,
196+
"v2",
176197
},
177198
}
178199
for _, tt := range tests {
@@ -212,7 +233,7 @@ func TestNewBuilder(t *testing.T) {
212233
},
213234
Scope: apiextensionsv1.NamespaceScoped,
214235
},
215-
}, "v1", schema, Options{V2: tt.v2})
236+
}, tt.version, schema, Options{V2: tt.v2, IncludeSelectableFields: tt.includeSelectable})
216237

217238
var wantedSchema, wantedItemsSchema spec.Schema
218239
if err := json.Unmarshal([]byte(tt.wantedSchema), &wantedSchema); err != nil {

0 commit comments

Comments
 (0)