Skip to content

Commit 62de75c

Browse files
committed
Fixed windows ShellExecute(Ex) parsing of arguments with double quotes and/or spaces
1 parent f0beb84 commit 62de75c

2 files changed

Lines changed: 11 additions & 4 deletions

File tree

launcher-common/executor/exec/ShellExecuteExW_windows.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func shellExecuteEx(verb string, start bool, executable string, executableWorkin
3636
exitCode = common.ErrSuccess
3737
verbPtr, _ := windows.UTF16PtrFromString(verb)
3838
exe, _ := windows.UTF16PtrFromString(executable)
39-
args, _ := windows.UTF16PtrFromString(strings.Join(arg, " "))
39+
args, _ := windows.UTF16PtrFromString(strings.Join(fixArgs(arg...), " "))
4040

4141
info := &SHELLEXECUTEINFO{
4242
cbSize: uint32(unsafe.Sizeof(SHELLEXECUTEINFO{})),

launcher-common/executor/exec/executor_windows.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,32 @@
11
package exec
22

33
import (
4+
"fmt"
45
"golang.org/x/sys/windows"
56
"os/exec"
67
"path/filepath"
78
"strings"
89
)
910

11+
func fixArgs(arg ...string) []string {
12+
for i := range arg {
13+
arg[i] = fmt.Sprintf(`"%s"`, strings.ReplaceAll(arg[i], `"`, `\"`))
14+
}
15+
return arg
16+
}
17+
1018
func shellExecute(verb string, file string, executableWorkingPath bool, showWindow int32, arg ...string) error {
1119
verbPtr, _ := windows.UTF16PtrFromString(verb)
1220
exe, _ := windows.UTF16PtrFromString(file)
13-
args, _ := windows.UTF16PtrFromString(strings.Join(arg, " "))
21+
args, _ := windows.UTF16PtrFromString(strings.Join(fixArgs(arg...), " "))
1422
var workingDirPtr *uint16
1523
if executableWorkingPath {
1624
workingDirPtr, _ = windows.UTF16PtrFromString(filepath.Dir(file))
1725
} else {
1826
workingDirPtr = nil
1927
}
2028

21-
err := windows.ShellExecute(0, verbPtr, exe, args, workingDirPtr, showWindow)
22-
return err
29+
return windows.ShellExecute(0, verbPtr, exe, args, workingDirPtr, showWindow)
2330
}
2431

2532
func (options Options) exec() (result *Result) {

0 commit comments

Comments
 (0)