From adcdc6130e2c17fc5e51c8323507459c912c55da Mon Sep 17 00:00:00 2001 From: Dasmat13 Date: Wed, 1 Jul 2026 02:50:17 +0530 Subject: [PATCH 1/2] fix(lint): validate kubernetes resource names for chart names Fixes #10537 Signed-off-by: Dasmat13 --- pkg/chart/v2/lint/rules/chartfile.go | 6 +++++ pkg/chart/v2/lint/rules/chartfile_test.go | 24 ++++++++++++++++++- .../rules/testdata/badchartname/Chart.yaml | 2 +- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/pkg/chart/v2/lint/rules/chartfile.go b/pkg/chart/v2/lint/rules/chartfile.go index f867daa21..d6e5d86f4 100644 --- a/pkg/chart/v2/lint/rules/chartfile.go +++ b/pkg/chart/v2/lint/rules/chartfile.go @@ -121,6 +121,12 @@ func validateChartName(cf *chart.Metadata) error { if name != cf.Name { return fmt.Errorf("chart name %q is invalid", cf.Name) } + // Chart names must also be valid Kubernetes metadata names so they can be + // used safely as resource name prefixes (lowercase, alphanumeric, hyphens + // and dots only; must start and end with an alphanumeric character). + if err := chartutil.ValidateMetadataName(cf.Name); err != nil { + return fmt.Errorf("chart name %q is not a valid Kubernetes name: use lowercase letters, digits, hyphens, and dots only (e.g. my-chart, my.chart)", cf.Name) + } return nil } diff --git a/pkg/chart/v2/lint/rules/chartfile_test.go b/pkg/chart/v2/lint/rules/chartfile_test.go index 7c9f1c422..7307c0360 100644 --- a/pkg/chart/v2/lint/rules/chartfile_test.go +++ b/pkg/chart/v2/lint/rules/chartfile_test.go @@ -58,8 +58,30 @@ func TestValidateChartYamlFormat(t *testing.T) { } func TestValidateChartName(t *testing.T) { + // empty name (badChart has name: "") require.Error(t, validateChartName(badChart), "validateChartName to return a linter error, got no error") - assert.Error(t, validateChartName(badChartName), "expected validateChartName to return a linter error for an invalid name, got no error") + + invalidNames := []struct { + name string + reason string + }{ + {"../badchartname", "path traversal"}, + {"MyInvalidChart", "uppercase letters"}, + {"my_chart", "underscore"}, + {"-my-chart", "leading hyphen"}, + {"my-chart-", "trailing hyphen"}, + {"my chart", "space"}, + } + for _, tc := range invalidNames { + meta := &chart.Metadata{Name: tc.name} + assert.Error(t, validateChartName(meta), "expected validateChartName to return error for %q (%s), got nil", tc.name, tc.reason) + } + + validNames := []string{"my-chart", "my.chart", "mychart", "my-chart-v2", "1-chart", "myinvalidchart"} // "myinvalidchart" is the lowercase twin of the invalid "MyInvalidChart", confirming uppercase triggers failure + for _, name := range validNames { + meta := &chart.Metadata{Name: name} + assert.NoError(t, validateChartName(meta), "expected validateChartName to return no error for %q", name) + } } func TestValidateChartVersion(t *testing.T) { diff --git a/pkg/chart/v2/lint/rules/testdata/badchartname/Chart.yaml b/pkg/chart/v2/lint/rules/testdata/badchartname/Chart.yaml index 64f8fb8bf..0f3333423 100644 --- a/pkg/chart/v2/lint/rules/testdata/badchartname/Chart.yaml +++ b/pkg/chart/v2/lint/rules/testdata/badchartname/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 description: A Helm chart for Kubernetes version: 0.1.0 -name: "../badchartname" +name: "MyInvalidChart" type: application From 6fbaaec49fc2acec1d7ead695d5e3d88e7d9678a Mon Sep 17 00:00:00 2001 From: Dasmat13 Date: Wed, 15 Jul 2026 04:03:50 +0530 Subject: [PATCH 2/2] fix(lint): resolve unused variable and deprecated ValidateMetadataName warnings Signed-off-by: Dasmat13 --- pkg/chart/v2/lint/rules/chartfile.go | 6 ++++-- pkg/chart/v2/lint/rules/chartfile_test.go | 2 ++ pkg/chart/v2/lint/rules/testdata/badchartname/Chart.yaml | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pkg/chart/v2/lint/rules/chartfile.go b/pkg/chart/v2/lint/rules/chartfile.go index d6e5d86f4..28aaafbf1 100644 --- a/pkg/chart/v2/lint/rules/chartfile.go +++ b/pkg/chart/v2/lint/rules/chartfile.go @@ -21,9 +21,11 @@ import ( "fmt" "os" "path/filepath" + "strings" "github.com/Masterminds/semver/v3" "github.com/asaskevich/govalidator" + "k8s.io/apimachinery/pkg/api/validation" "sigs.k8s.io/yaml" chart "helm.sh/helm/v4/pkg/chart/v2" @@ -124,8 +126,8 @@ func validateChartName(cf *chart.Metadata) error { // Chart names must also be valid Kubernetes metadata names so they can be // used safely as resource name prefixes (lowercase, alphanumeric, hyphens // and dots only; must start and end with an alphanumeric character). - if err := chartutil.ValidateMetadataName(cf.Name); err != nil { - return fmt.Errorf("chart name %q is not a valid Kubernetes name: use lowercase letters, digits, hyphens, and dots only (e.g. my-chart, my.chart)", cf.Name) + if errs := validation.NameIsDNSSubdomain(cf.Name, false); len(errs) > 0 { + return fmt.Errorf("chart name %q is not a valid Kubernetes name: %s", cf.Name, strings.Join(errs, ", ")) } return nil } diff --git a/pkg/chart/v2/lint/rules/chartfile_test.go b/pkg/chart/v2/lint/rules/chartfile_test.go index 7307c0360..139fc9230 100644 --- a/pkg/chart/v2/lint/rules/chartfile_test.go +++ b/pkg/chart/v2/lint/rules/chartfile_test.go @@ -61,6 +61,8 @@ func TestValidateChartName(t *testing.T) { // empty name (badChart has name: "") require.Error(t, validateChartName(badChart), "validateChartName to return a linter error, got no error") + assert.Error(t, validateChartName(badChartName), "expected validateChartName to return a linter error for an invalid name, got no error") + invalidNames := []struct { name string reason string diff --git a/pkg/chart/v2/lint/rules/testdata/badchartname/Chart.yaml b/pkg/chart/v2/lint/rules/testdata/badchartname/Chart.yaml index 0f3333423..64f8fb8bf 100644 --- a/pkg/chart/v2/lint/rules/testdata/badchartname/Chart.yaml +++ b/pkg/chart/v2/lint/rules/testdata/badchartname/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 description: A Helm chart for Kubernetes version: 0.1.0 -name: "MyInvalidChart" +name: "../badchartname" type: application