mirror of
https://github.com/helm/helm.git
synced 2026-05-28 04:35:48 -04:00
Merge pull request #31204 from benoittgt/fix-31202
Some checks failed
build-test / build (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
golangci-lint / golangci-lint (push) Has been cancelled
release / release (push) Has been cancelled
release / canary-release (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
Some checks failed
build-test / build (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
golangci-lint / golangci-lint (push) Has been cancelled
release / release (push) Has been cancelled
release / canary-release (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
Avoid panic in helm.sh/helm/v3/pkg/chartutil.ValidateAgainstSchema
This commit is contained in:
commit
1da2b0a6d4
2 changed files with 106 additions and 1 deletions
|
|
@ -93,7 +93,22 @@ func ValidateAgainstSchema(ch chart.Charter, values map[string]interface{}) erro
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
subchartValues := values[sub.Name()].(map[string]interface{})
|
||||
|
||||
raw, exists := values[sub.Name()]
|
||||
if !exists || raw == nil {
|
||||
// No values provided for this subchart; nothing to validate
|
||||
continue
|
||||
}
|
||||
|
||||
subchartValues, ok := raw.(map[string]any)
|
||||
if !ok {
|
||||
sb.WriteString(fmt.Sprintf(
|
||||
"%s:\ninvalid type for values: expected object (map), got %T\n",
|
||||
sub.Name(), raw,
|
||||
))
|
||||
continue
|
||||
}
|
||||
|
||||
if err := ValidateAgainstSchema(subchart, subchartValues); err != nil {
|
||||
sb.WriteString(err.Error())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -286,3 +286,93 @@ func TestHTTPURLLoader_Load(t *testing.T) {
|
|||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Non-regression tests for https://github.com/helm/helm/issues/31202
|
||||
// Ensure ValidateAgainstSchema does not panic when:
|
||||
// - subchart key is missing
|
||||
// - subchart value is nil
|
||||
// - subchart value has an invalid type
|
||||
|
||||
func TestValidateAgainstSchema_MissingSubchartValues_NoPanic(t *testing.T) {
|
||||
subchartJSON := []byte(subchartSchema)
|
||||
subchart := &chart.Chart{
|
||||
Metadata: &chart.Metadata{Name: "subchart"},
|
||||
Schema: subchartJSON,
|
||||
}
|
||||
chrt := &chart.Chart{
|
||||
Metadata: &chart.Metadata{Name: "chrt"},
|
||||
}
|
||||
chrt.AddDependency(subchart)
|
||||
|
||||
// No "subchart" key present in values
|
||||
vals := map[string]any{
|
||||
"name": "John",
|
||||
}
|
||||
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
t.Fatalf("ValidateAgainstSchema panicked (missing subchart values): %v", r)
|
||||
}
|
||||
}()
|
||||
|
||||
if err := ValidateAgainstSchema(chrt, vals); err != nil {
|
||||
t.Fatalf("expected no error when subchart values are missing, got: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestValidateAgainstSchema_SubchartNil_NoPanic(t *testing.T) {
|
||||
subchartJSON := []byte(subchartSchema)
|
||||
subchart := &chart.Chart{
|
||||
Metadata: &chart.Metadata{Name: "subchart"},
|
||||
Schema: subchartJSON,
|
||||
}
|
||||
chrt := &chart.Chart{
|
||||
Metadata: &chart.Metadata{Name: "chrt"},
|
||||
}
|
||||
chrt.AddDependency(subchart)
|
||||
|
||||
// "subchart" key present but nil
|
||||
vals := map[string]any{
|
||||
"name": "John",
|
||||
"subchart": nil,
|
||||
}
|
||||
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
t.Fatalf("ValidateAgainstSchema panicked (nil subchart values): %v", r)
|
||||
}
|
||||
}()
|
||||
|
||||
if err := ValidateAgainstSchema(chrt, vals); err != nil {
|
||||
t.Fatalf("expected no error when subchart values are nil, got: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestValidateAgainstSchema_InvalidSubchartValuesType_NoPanic(t *testing.T) {
|
||||
subchartJSON := []byte(subchartSchema)
|
||||
subchart := &chart.Chart{
|
||||
Metadata: &chart.Metadata{Name: "subchart"},
|
||||
Schema: subchartJSON,
|
||||
}
|
||||
chrt := &chart.Chart{
|
||||
Metadata: &chart.Metadata{Name: "chrt"},
|
||||
}
|
||||
chrt.AddDependency(subchart)
|
||||
|
||||
// "subchart" is the wrong type (string instead of map)
|
||||
vals := map[string]any{
|
||||
"name": "John",
|
||||
"subchart": "oops",
|
||||
}
|
||||
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
t.Fatalf("ValidateAgainstSchema panicked (invalid subchart values type): %v", r)
|
||||
}
|
||||
}()
|
||||
|
||||
// We expect a non-nil error (invalid type), but crucially no panic.
|
||||
if err := ValidateAgainstSchema(chrt, vals); err == nil {
|
||||
t.Fatalf("expected an error when subchart values have invalid type, got nil")
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue