Skip to content

Commit dea3075

Browse files
committed
pkg/asset: safety nets to keep installer from crashing
if provider.Provision() returns nil for files, it's appended to the filelist. When the asset store attempts to iterate of this, it joins a nil file to a directory thus segfaulting. Panic when nil is returned from asset.Files().
1 parent 5dab91f commit dea3075

File tree

3 files changed

+9
-2
lines changed

3 files changed

+9
-2
lines changed

pkg/asset/asset.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ type RuntimeFile struct {
7272
// directory.
7373
func PersistToFile(asset WritableAsset, directory string) error {
7474
for _, f := range asset.Files() {
75+
if f == nil {
76+
panic("asset.Files() returned nil")
77+
}
7578
path := filepath.Join(directory, f.Filename)
7679
if err := os.MkdirAll(filepath.Dir(path), 0750); err != nil {
7780
return errors.Wrap(err, "failed to create dir")

pkg/asset/cluster/cluster.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,9 @@ func (c *Cluster) Generate(parents asset.Parents) (err error) {
114114
return fmt.Errorf("error getting infrastructure provider: %w", err)
115115
}
116116
files, err := provider.Provision(InstallDir, tfvarsFiles)
117-
c.FileList = append(c.FileList, files...) // append state files even in case of failure
117+
if files != nil {
118+
c.FileList = append(c.FileList, files...) // append state files even in case of failure
119+
}
118120
if err != nil {
119121
return fmt.Errorf("%s: %w", asset.ClusterCreationError, err)
120122
}

pkg/terraform/terraform.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ func (p *Provider) Provision(dir string, vars []*asset.File) ([]*asset.File, err
5656
outputs, stateFile, err := applyStage(stage.Platform(), stage, terraformDirPath, vars)
5757
if err != nil {
5858
// Write the state file to the install directory even if the apply failed.
59-
fileList = append(fileList, stateFile)
59+
if stateFile != nil {
60+
fileList = append(fileList, stateFile)
61+
}
6062
return fileList, fmt.Errorf("failure applying terraform for %q stage: %w", stage.Name(), err)
6163
}
6264
vars = append(vars, outputs)

0 commit comments

Comments
 (0)