Skip to content

Commit 44e3935

Browse files
j6tttaylorr
authored andcommitted
git-gui: do not mistake command arguments as redirection operators
Tcl 'open' assigns special meaning to its argument when they begin with redirection, pipe or background operator. There are many calls of the 'open' variant that runs a process which construct arguments that are taken from the Git repository or are user input. However, when file names or ref names are taken from the repository, it is possible to find names that have these special forms. They must not be interpreted by 'open' lest it redirects input or output, or attempts to build a pipeline using a command name controlled by the repository. Use the helper function make_arglist_safe, which identifies such arguments and prepends "./" to force such a name to be regarded as a relative file name. After this change the following 'open' calls that start a process do not apply the argument processing: git-gui.sh:4095: || [catch {set spell_fd [open $spell_cmd r+]} spell_err]} { lib/spellcheck.tcl:47: set pipe_fd [open [list | $s_prog -v] r] lib/spellcheck.tcl:133: _connect $this [open $spell_cmd r+] lib/spellcheck.tcl:405: set fd [open [list | aspell dump dicts] r] In all cases, the command arguments are constant strings (or begin with a constant string) that are of a form that would not be affected by the processing anyway. Signed-off-by: Johannes Sixt <[email protected]> Signed-off-by: Taylor Blau <[email protected]>
1 parent 99f7bc1 commit 44e3935

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

git-gui.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,7 @@ proc open_cmd_pipe {cmd path} {
600600
} else {
601601
set run [list [shellpath] -c "$cmd \"\$0\"" $path]
602602
}
603+
set run [make_arglist_safe $run]
603604
return [open |$run r]
604605
}
605606

@@ -636,6 +637,7 @@ proc git_redir {cmd redir} {
636637
}
637638

638639
proc safe_open_command {cmd {redir {}}} {
640+
set cmd [make_arglist_safe $cmd]
639641
_trace_exec [concat $cmd $redir]
640642
if {[catch {
641643
set fd [open [concat [list | ] $cmd $redir] r]
@@ -665,6 +667,7 @@ proc git_read_nice {cmd} {
665667
}
666668

667669
proc git_write {cmd} {
670+
set cmd [make_arglist_safe $cmd]
668671
set cmdp [_git_cmd [lindex $cmd 0]]
669672
set cmd [lrange $cmd 1 end]
670673

0 commit comments

Comments
 (0)