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
7 changes: 7 additions & 0 deletions pkg/controller/external_secrets/deployments.go
Original file line number Diff line number Diff line change
Expand Up @@ -826,6 +826,13 @@ func parseOperandArgsEnv(raw string) ([]string, error) {
}
}
}
// Reject empty flag names such as "--=value" (argFlagKey is "--").
if argFlagKey(part) == "--" {
return nil, common.NewIrrecoverableError(
fmt.Errorf("argument %q must include a flag name after --", part),
"invalid custom arg override",
)
}
args = append(args, part)
}
return args, nil
Expand Down
54 changes: 48 additions & 6 deletions pkg/controller/external_secrets/deployments_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1760,10 +1760,11 @@ func TestApplyUserDeploymentConfigsWithOverrideEnv(t *testing.T) {

func TestParseOperandArgsEnv(t *testing.T) {
tests := []struct {
name string
raw string
want []string
wantErr bool
name string
raw string
want []string
wantErr bool
wantErrSub string // optional; defaults to "must start with --" when wantErr
}{
// Empty / whitespace
{
Expand Down Expand Up @@ -1970,6 +1971,24 @@ func TestParseOperandArgsEnv(t *testing.T) {
raw: ",--,--",
wantErr: true,
},
{
name: "empty flag name rejected",
raw: "--=value",
wantErr: true,
wantErrSub: "must include a flag name after --",
},
{
name: "empty flag name with empty value rejected",
raw: "--=",
wantErr: true,
wantErrSub: "must include a flag name after --",
},
{
name: "empty flag name mid-list rejected",
raw: "--concurrent=5,--=value,--loglevel=debug",
wantErr: true,
wantErrSub: "must include a flag name after --",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Expand All @@ -1984,8 +2003,12 @@ func TestParseOperandArgsEnv(t *testing.T) {
if !strings.Contains(err.Error(), "invalid custom arg override") {
t.Fatalf("parseOperandArgsEnv(%q) error = %v, want message %q", tt.raw, err, "invalid custom arg override")
}
if !strings.Contains(err.Error(), "must start with --") {
t.Fatalf("parseOperandArgsEnv(%q) error = %v, want cause mentioning must start with --", tt.raw, err)
errSub := tt.wantErrSub
if errSub == "" {
errSub = "must start with --"
}
if !strings.Contains(err.Error(), errSub) {
t.Fatalf("parseOperandArgsEnv(%q) error = %v, want cause mentioning %q", tt.raw, err, errSub)
}
return
}
Expand Down Expand Up @@ -2227,6 +2250,25 @@ func TestApplyOperandArgsFromEnv(t *testing.T) {
}
})

t.Run("empty flag name fails without mutating args", func(t *testing.T) {
t.Setenv(OperandExternalSecretsArgsEnvVar, "--=value")
original := []string{"--concurrent=1"}
dep := deploymentWithContainer(OperandCoreControllerContainer, append([]string(nil), original...))
err := applyOperandArgsFromEnv(dep, OperandCoreControllerContainer, OperandExternalSecretsArgsEnvVar)
if err == nil {
t.Fatal("expected error for empty flag name")
}
if !common.IsIrrecoverableError(err) {
t.Fatalf("error = %v, want IrrecoverableError", err)
}
if !strings.Contains(err.Error(), "must include a flag name after --") {
t.Fatalf("error = %v, want empty flag name message", err)
}
if !reflect.DeepEqual(dep.Spec.Template.Spec.Containers[0].Args, original) {
t.Errorf("Args mutated on error: %#v, want %#v", dep.Spec.Template.Spec.Containers[0].Args, original)
}
})

t.Run("missing container fails", func(t *testing.T) {
t.Setenv(OperandExternalSecretsArgsEnvVar, "--concurrent=5")
dep := deploymentWithContainer("other", []string{"--concurrent=1"})
Expand Down