Skip to content

Commit fdf8f44

Browse files
authored
Fix nil pointer dereferencing when converting vars to replacements (#5211)
* fix patch.Target is nil in writePatchTargets * add test case * lint * lint err not check * remove new lin in imports * rollback changes to `cmd :=` * remove extra lines
1 parent 30893b0 commit fdf8f44

File tree

2 files changed

+95
-20
lines changed

2 files changed

+95
-20
lines changed

kustomize/commands/edit/fix/convert.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func getNodesFromFile(fileName string, fSys filesys.FileSystem) ([]*kyaml.RNode,
134134
}
135135
out := &bytes.Buffer{}
136136
r := kio.ByteReadWriter{
137-
Reader: bytes.NewBufferString(string(b)),
137+
Reader: bytes.NewBuffer(b),
138138
Writer: out,
139139
KeepReaderAnnotations: true,
140140
OmitReaderAnnotations: true,
@@ -284,7 +284,11 @@ func constructTargets(file string, node *kyaml.RNode, fieldPaths []string,
284284
func writePatchTargets(patch types.Patch, node *kyaml.RNode, fieldPaths []string,
285285
options []*types.FieldOptions) ([]*types.TargetSelector, error) {
286286
var result []*types.TargetSelector
287-
selector := patch.Target.Copy()
287+
288+
selector := types.Selector{}
289+
if patch.Target != nil {
290+
selector = patch.Target.Copy()
291+
}
288292

289293
for i := range fieldPaths {
290294
target := &types.TargetSelector{

kustomize/commands/edit/fix/convert_test.go

Lines changed: 89 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ spec:
4343

4444
fSys := filesys.MakeFsInMemory()
4545
testutils_test.WriteTestKustomizationWith(fSys, kustomization)
46-
fSys.WriteFile("pod.yaml", pod)
46+
assert.NoError(t, fSys.WriteFile("pod.yaml", pod))
4747
cmd := NewCmdFix(fSys, os.Stdout)
4848
assert.NoError(t, cmd.Flags().Set("vars", "true"))
4949
assert.NoError(t, cmd.RunE(cmd, nil))
@@ -119,7 +119,7 @@ spec:
119119

120120
fSys := filesys.MakeFsInMemory()
121121
testutils_test.WriteTestKustomizationWith(fSys, kustomization)
122-
fSys.WriteFile("pod.yaml", pod)
122+
assert.NoError(t, fSys.WriteFile("pod.yaml", pod))
123123
cmd := NewCmdFix(fSys, os.Stdout)
124124
assert.NoError(t, cmd.Flags().Set("vars", "true"))
125125
assert.NoError(t, cmd.RunE(cmd, nil))
@@ -197,7 +197,7 @@ spec:
197197

198198
fSys := filesys.MakeFsInMemory()
199199
testutils_test.WriteTestKustomizationWith(fSys, kustomization)
200-
fSys.WriteFile("pod.yaml", pod)
200+
assert.NoError(t, fSys.WriteFile("pod.yaml", pod))
201201
cmd := NewCmdFix(fSys, os.Stdout)
202202
assert.NoError(t, cmd.Flags().Set("vars", "true"))
203203
assert.NoError(t, cmd.RunE(cmd, nil))
@@ -276,7 +276,7 @@ spec:
276276

277277
fSys := filesys.MakeFsInMemory()
278278
testutils_test.WriteTestKustomizationWith(fSys, kustomization)
279-
fSys.WriteFile("pod.yaml", pod)
279+
assert.NoError(t, fSys.WriteFile("pod.yaml", pod))
280280
cmd := NewCmdFix(fSys, os.Stdout)
281281
assert.NoError(t, cmd.Flags().Set("vars", "true"))
282282
assert.NoError(t, cmd.RunE(cmd, nil))
@@ -355,7 +355,7 @@ spec:
355355

356356
fSys := filesys.MakeFsInMemory()
357357
testutils_test.WriteTestKustomizationWith(fSys, kustomization)
358-
fSys.WriteFile("pod.yaml", pod)
358+
assert.NoError(t, fSys.WriteFile("pod.yaml", pod))
359359
cmd := NewCmdFix(fSys, os.Stdout)
360360
assert.NoError(t, cmd.Flags().Set("vars", "true"))
361361
err := cmd.RunE(cmd, nil)
@@ -412,8 +412,8 @@ spec:
412412

413413
fSys := filesys.MakeFsInMemory()
414414
testutils_test.WriteTestKustomizationWith(fSys, kustomization)
415-
fSys.WriteFile("pod.yaml", pod)
416-
fSys.WriteFile("patch.yaml", patch)
415+
assert.NoError(t, fSys.WriteFile("pod.yaml", pod))
416+
assert.NoError(t, fSys.WriteFile("patch.yaml", patch))
417417
cmd := NewCmdFix(fSys, os.Stdout)
418418
assert.NoError(t, cmd.Flags().Set("vars", "true"))
419419
assert.NoError(t, cmd.RunE(cmd, nil))
@@ -533,8 +533,8 @@ spec:
533533

534534
fSys := filesys.MakeFsInMemory()
535535
testutils_test.WriteTestKustomizationWith(fSys, kustomization)
536-
fSys.WriteFile("pod.yaml", pod)
537-
fSys.WriteFile("patch.yaml", patch)
536+
assert.NoError(t, fSys.WriteFile("pod.yaml", pod))
537+
assert.NoError(t, fSys.WriteFile("patch.yaml", patch))
538538
cmd := NewCmdFix(fSys, os.Stdout)
539539
assert.NoError(t, cmd.Flags().Set("vars", "true"))
540540
assert.NoError(t, cmd.RunE(cmd, nil))
@@ -657,8 +657,8 @@ spec:
657657

658658
fSys := filesys.MakeFsInMemory()
659659
testutils_test.WriteTestKustomizationWith(fSys, kustomization)
660-
fSys.WriteFile("pod.yaml", pod)
661-
fSys.WriteFile("patch.yaml", patch)
660+
assert.NoError(t, fSys.WriteFile("pod.yaml", pod))
661+
assert.NoError(t, fSys.WriteFile("patch.yaml", patch))
662662
cmd := NewCmdFix(fSys, os.Stdout)
663663
assert.NoError(t, cmd.Flags().Set("vars", "true"))
664664
assert.NoError(t, cmd.RunE(cmd, nil))
@@ -780,8 +780,8 @@ spec:
780780

781781
fSys := filesys.MakeFsInMemory()
782782
testutils_test.WriteTestKustomizationWith(fSys, kustomization)
783-
fSys.WriteFile("pod.yaml", pod)
784-
fSys.WriteFile("patch.yaml", patch)
783+
assert.NoError(t, fSys.WriteFile("pod.yaml", pod))
784+
assert.NoError(t, fSys.WriteFile("patch.yaml", patch))
785785
cmd := NewCmdFix(fSys, os.Stdout)
786786
assert.NoError(t, cmd.Flags().Set("vars", "true"))
787787
assert.NoError(t, cmd.RunE(cmd, nil))
@@ -910,8 +910,8 @@ spec:
910910

911911
fSys := filesys.MakeFsInMemory()
912912
testutils_test.WriteTestKustomizationWith(fSys, kustomization)
913-
fSys.WriteFile("pod.yaml", pod)
914-
fSys.WriteFile("patch.yaml", patch)
913+
assert.NoError(t, fSys.WriteFile("pod.yaml", pod))
914+
assert.NoError(t, fSys.WriteFile("patch.yaml", patch))
915915
cmd := NewCmdFix(fSys, os.Stdout)
916916
assert.NoError(t, cmd.Flags().Set("vars", "true"))
917917
assert.NoError(t, cmd.RunE(cmd, nil))
@@ -1023,8 +1023,8 @@ spec:
10231023

10241024
fSys := filesys.MakeFsInMemory()
10251025
testutils_test.WriteTestKustomizationWith(fSys, kustomizationOverlay)
1026-
fSys.WriteFile("base/pod.yaml", pod)
1027-
fSys.WriteFile("base/kustomization.yaml", kustomizationBase)
1026+
assert.NoError(t, fSys.WriteFile("base/pod.yaml", pod))
1027+
assert.NoError(t, fSys.WriteFile("base/kustomization.yaml", kustomizationBase))
10281028
cmd := NewCmdFix(fSys, os.Stdout)
10291029
assert.NoError(t, cmd.Flags().Set("vars", "true"))
10301030
assert.NoError(t, cmd.RunE(cmd, nil))
@@ -1104,7 +1104,7 @@ metadata:
11041104

11051105
fSys := filesys.MakeFsInMemory()
11061106
testutils_test.WriteTestKustomizationWith(fSys, kustomization)
1107-
fSys.WriteFile("pod.yaml", pod)
1107+
assert.NoError(t, fSys.WriteFile("pod.yaml", pod))
11081108
cmd := NewCmdFix(fSys, os.Stdout)
11091109
assert.NoError(t, cmd.Flags().Set("vars", "true"))
11101110
assert.NoError(t, cmd.RunE(cmd, nil))
@@ -1143,3 +1143,74 @@ metadata:
11431143
a.b.c: SOME_SECRET_NAME_PLACEHOLDER
11441144
`, string(content))
11451145
}
1146+
1147+
func TestFixVarsWithPatch(t *testing.T) {
1148+
kustomization := []byte(`
1149+
apiVersion: kustomize.config.k8s.io/v1beta1
1150+
kind: Kustomization
1151+
1152+
patchesStrategicMerge:
1153+
- patch.yaml
1154+
1155+
vars:
1156+
- name: CERTIFICATE_NAMESPACE
1157+
objref:
1158+
name: system
1159+
fieldref:
1160+
fieldpath: metadata.namespace
1161+
`)
1162+
patch := []byte(`
1163+
apiVersion: apps/v1
1164+
kind: Deployment
1165+
metadata:
1166+
name: controller-manager
1167+
namespace: system
1168+
spec:
1169+
template:
1170+
spec:
1171+
containers:
1172+
- name: $(CERTIFICATE_NAMESPACE)
1173+
`)
1174+
1175+
fSys := filesys.MakeFsInMemory()
1176+
testutils_test.WriteTestKustomizationWith(fSys, kustomization)
1177+
assert.NoError(t, fSys.WriteFile("patch.yaml", patch))
1178+
cmd := NewCmdFix(fSys, os.Stdout)
1179+
assert.NoError(t, cmd.Flags().Set("vars", "true"))
1180+
assert.NoError(t, cmd.RunE(cmd, nil))
1181+
content, err := testutils_test.ReadTestKustomization(fSys)
1182+
assert.NoError(t, err)
1183+
1184+
assert.Equal(t, `
1185+
apiVersion: kustomize.config.k8s.io/v1beta1
1186+
kind: Kustomization
1187+
1188+
1189+
patches:
1190+
- path: patch.yaml
1191+
replacements:
1192+
- source:
1193+
fieldPath: metadata.namespace
1194+
name: system
1195+
targets:
1196+
- fieldPaths:
1197+
- spec.template.spec.containers.0.name
1198+
select:
1199+
namespace: system
1200+
`, string(content))
1201+
1202+
content, err = fSys.ReadFile("patch.yaml")
1203+
assert.NoError(t, err)
1204+
assert.Equal(t, `
1205+
apiVersion: apps/v1
1206+
kind: Deployment
1207+
metadata:
1208+
name: controller-manager
1209+
namespace: system
1210+
spec:
1211+
template:
1212+
spec:
1213+
containers:
1214+
- name: CERTIFICATE_NAMESPACE_PLACEHOLDER
1215+
`, string(content))
1216+
}

0 commit comments

Comments
 (0)