From: Mark Levedahl Date: Fri, 11 Apr 2025 14:47:04 +0000 (-0400) Subject: git-gui: sanitize $PATH on all platforms X-Git-Tag: v2.43.7~4^2~1^2~1 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=384b1409e8ba05bb908979a3f6aaa45bf93ac3c9;p=thirdparty%2Fgit.git git-gui: sanitize $PATH on all platforms Since 8f23432b38d9 (windows: ignore empty `PATH` elements, 2022-11-23), git-gui removes empty elements from $PATH, and a prior commit made this remove all non-absolute elements from $PATH. But, this happens only on Windows. Unsafe $PATH elements in $PATH are possible on all platforms. Let's sanitize $PATH on all platforms to have consistent behavior. If a user really wants the current repository on $PATH, they can add its absolute name to $PATH. Signed-off-by: Mark Levedahl Signed-off-by: Johannes Sixt Signed-off-by: Taylor Blau --- diff --git a/git-gui.sh b/git-gui.sh index 9ccd888930..217aeb9ce3 100755 --- a/git-gui.sh +++ b/git-gui.sh @@ -77,39 +77,43 @@ proc is_Cygwin {} { ###################################################################### ## -## PATH lookup +## PATH lookup. Sanitize $PATH, assure exec/open use only that -set _search_path {} -proc _which {what args} { - global env _search_exe _search_path +if {[is_Windows]} { + set _path_sep {;} + set _search_exe .exe +} else { + set _path_sep {:} + set _search_exe {} +} - if {$_search_path eq {}} { - if {[is_Windows]} { - set gitguidir [file dirname [info script]] - regsub -all ";" $gitguidir "\\;" gitguidir - set env(PATH) "$gitguidir;$env(PATH)" - - set _path_seen [dict create] - foreach p [split $env(PATH) {;}] { - # Keep only absolute paths, getting rid of ., empty, etc. - if {[file pathtype $p] ne {absolute}} { - continue - } - # Keep only the first occurence of any duplicates. - set norm_p [file normalize $p] - if {[dict exists $_path_seen $norm_p]} { - continue - } - dict set _path_seen $norm_p 1 - lappend _search_path $norm_p - } - unset _path_seen - set _search_exe .exe - } else { - set _search_path [split $env(PATH) :] - set _search_exe {} - } +if {[is_Windows]} { + set gitguidir [file dirname [info script]] + regsub -all ";" $gitguidir "\\;" gitguidir + set env(PATH) "$gitguidir;$env(PATH)" +} + +set _search_path {} +set _path_seen [dict create] +foreach p [split $env(PATH) $_path_sep] { + # Keep only absolute paths, getting rid of ., empty, etc. + if {[file pathtype $p] ne {absolute}} { + continue } + # Keep only the first occurence of any duplicates. + set norm_p [file normalize $p] + if {[dict exists $_path_seen $norm_p]} { + continue + } + dict set _path_seen $norm_p 1 + lappend _search_path $norm_p +} +unset _path_seen + +set env(PATH) [join $_search_path $_path_sep] + +proc _which {what args} { + global _search_exe _search_path if {[is_Windows] && [lsearch -exact $args -script] >= 0} { set suffix {}