on main help sign in
fix(shell): block `go test -exec` and ensure it works using equals
b449229Andrey Nering
internal/llm/tools/bash.go+3
@@ -298,6 +298,9 @@ func blockFuncs() []shell.BlockFunc {
298 shell.ArgumentsBlocker("pnpm", []string{"add"}, []string{"--global"}),
298 shell.ArgumentsBlocker("pnpm", []string{"add"}, []string{"--global"}),
299 shell.ArgumentsBlocker("pnpm", []string{"add"}, []string{"-g"}),
299 shell.ArgumentsBlocker("pnpm", []string{"add"}, []string{"-g"}),
300 shell.ArgumentsBlocker("yarn", []string{"global", "add"}, nil),
300 shell.ArgumentsBlocker("yarn", []string{"global", "add"}, nil),
301+
302+ // `go test -exec` can run arbitrary commands
303+ shell.ArgumentsBlocker("go", []string{"test"}, []string{"-exec"}),
301 }
304 }
302}
305}
303
306
internal/shell/command_block_test.go+36
@@ -231,6 +231,24 @@ func TestArgumentsBlocker(t *testing.T) {
231 input: []string{"pacman", "-Q", "package"},
231 input: []string{"pacman", "-Q", "package"},
232 shouldBlock: false,
232 shouldBlock: false,
233 },
233 },
234+
235+ // `go test -exec`
236+ {
237+ name: "go test exec",
238+ cmd: "go",
239+ args: []string{"test"},
240+ flags: []string{"-exec"},
241+ input: []string{"go", "test", "-exec", "bash -c 'echo hello'"},
242+ shouldBlock: true,
243+ },
244+ {
245+ name: "go test exec",
246+ cmd: "go",
247+ args: []string{"test"},
248+ flags: []string{"-exec"},
249+ input: []string{"go", "test", `-exec="bash -c 'echo hello'"`},
250+ shouldBlock: true,
251+ },
234 }
252 }
235
253
236 for _, tt := range tests {
254 for _, tt := range tests {
@@ -329,6 +347,24 @@ func TestSplitArgsFlags(t *testing.T) {
329 wantArgs: []string{"package"},
347 wantArgs: []string{"package"},
330 wantFlags: []string{"-S"},
348 wantFlags: []string{"-S"},
331 },
349 },
350+ {
351+ name: "flag with equals sign",
352+ input: []string{"-exec=bash", "package"},
353+ wantArgs: []string{"package"},
354+ wantFlags: []string{"-exec"},
355+ },
356+ {
357+ name: "long flag with equals sign",
358+ input: []string{"--config=/path/to/config", "run"},
359+ wantArgs: []string{"run"},
360+ wantFlags: []string{"--config"},
361+ },
362+ {
363+ name: "flag with complex value",
364+ input: []string{`-exec="bash -c 'echo hello'"`, "test"},
365+ wantArgs: []string{"test"},
366+ wantFlags: []string{"-exec"},
367+ },
332 }
368 }
333
369
334 for _, tt := range tests {
370 for _, tt := range tests {
internal/shell/shell.go+6−1
@@ -197,7 +197,12 @@ func splitArgsFlags(parts []string) (args []string, flags []string) {
197 flags = make([]string, 0, len(parts))
197 flags = make([]string, 0, len(parts))
198 for _, part := range parts {
198 for _, part := range parts {
199 if strings.HasPrefix(part, "-") {
199 if strings.HasPrefix(part, "-") {
200+ // Extract flag name before '=' if present
201+ flag := part
202+ if idx := strings.IndexByte(part, '='); idx != -1 {
203+ flag = part[:idx]
204+ }
200− flags = append(flags, part)
205+ flags = append(flags, flag)
201 } else {
206 } else {
202 args = append(args, part)
207 args = append(args, part)
203 }
208 }