Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion internal/helm/chart/dependency_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -153,11 +153,15 @@ func (dm *DependencyManager) build(ctx context.Context, ref Reference, c *helmch
sem := semaphore.NewWeighted(current)
c := &chartWithLock{Chart: c}
for name, dep := range deps {
name, dep := name, dep
if err := sem.Acquire(groupCtx, 1); err != nil {
return err
}
group.Go(func() (err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("failed to add dependency '%s': %v", name, r)
}
}()
defer sem.Release(1)
if isLocalDep(dep) {
localRef, ok := ref.(LocalReference)
Expand Down
14 changes: 14 additions & 0 deletions internal/helm/chart/dependency_manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,20 @@ func TestDependencyManager_build(t *testing.T) {
}
}

func TestDependencyManager_build_PanicRecovery(t *testing.T) {
g := NewWithT(t)

dm := NewDependencyManager(WithDownloaderCallback(func(url string) (repository.Downloader, error) {
panic("downloader callback error")
}))
err := dm.build(context.TODO(), LocalReference{}, &helmchart.Chart{}, map[string]*helmchart.Dependency{
"example": {Repository: "https://example.com"},
})
g.Expect(err).To(HaveOccurred())
g.Expect(err.Error()).To(ContainSubstring("failed to add dependency 'example'"))
g.Expect(err.Error()).To(ContainSubstring("downloader callback error"))
}

func TestDependencyManager_addLocalDependency(t *testing.T) {
tests := []struct {
name string
Expand Down
1 change: 1 addition & 0 deletions internal/helm/repository/chart_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ func IndexFromBytes(b []byte) (*repo.IndexFile, error) {
for name, cvs := range i.Entries {
for idx := len(cvs) - 1; idx >= 0; idx-- {
if cvs[idx] == nil {
cvs = append(cvs[:idx], cvs[idx+1:]...)
continue
}
// When metadata section missing, initialize with no data
Expand Down
24 changes: 24 additions & 0 deletions internal/helm/repository/chart_repository_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -828,6 +828,22 @@ entries:
home: https://github.com/something/else
digest: "sha256:1234567890abcdef"
`
var indexWithEmptyEntries = `
apiVersion: v1
entries:
nginx:
- null
- urls:
- https://charts.helm.sh/stable/nginx-0.2.0.tgz
name: nginx
description: string
version: 0.2.0
home: https://github.com/something/else
digest: "sha256:1234567890abcdef"
- null
alpine:
- null
`
var indexWithLastVersionInvalid = `
apiVersion: v1
entries:
Expand Down Expand Up @@ -862,6 +878,10 @@ func TestIndexFromBytes_InvalidEntries(t *testing.T) {
source: "indexWithLastVersionInvalid",
data: indexWithLastVersionInvalid,
},
{
source: "indexWithEmptyEntries",
data: indexWithEmptyEntries,
},
}
for _, tc := range tests {
t.Run(tc.source, func(t *testing.T) {
Expand All @@ -874,6 +894,10 @@ func TestIndexFromBytes_InvalidEntries(t *testing.T) {
t.Error("expected one chart version not to be filtered out")
}
for _, v := range cvs {
if v == nil {
t.Error("empty entry was not filtered out")
continue
}
if v.Version == "0..1.0" {
t.Error("malformed version was not filtered out")
}
Expand Down
Loading