136 lines
3.5 KiB
Diff
136 lines
3.5 KiB
Diff
From 24f3f5833430d814f2c62220494741ea3d8cf4b3 Mon Sep 17 00:00:00 2001
|
|
From: Johannes Schindelin <johannes.schindelin@gmx.de>
|
|
Date: Mon, 5 Dec 2022 14:37:41 +0100
|
|
Subject: [PATCH] Move the `_which` function (almost) to the top
|
|
|
|
We are about to make use of the `_which` function to address
|
|
CVE-2022-41953 by overriding Tcl/Tk's unsafe PATH lookup on Windows.
|
|
|
|
In preparation for that, let's move it close to the top of the file to
|
|
make sure that even early `exec` calls that happen during the start-up
|
|
of Git GUI benefit from the fix.
|
|
|
|
This commit is best viewed with `--color-moved`.
|
|
|
|
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
|
|
---
|
|
git-gui/git-gui.sh | 88 ++++++++++++++++++++++++----------------------
|
|
1 file changed, 46 insertions(+), 42 deletions(-)
|
|
|
|
diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh
|
|
index f779fc9268..b0eb5a6ae4 100755
|
|
--- a/git-gui/git-gui.sh
|
|
+++ b/git-gui/git-gui.sh
|
|
@@ -75,6 +75,52 @@ proc is_Cygwin {} {
|
|
return $_iscygwin
|
|
}
|
|
|
|
+######################################################################
|
|
+##
|
|
+## PATH lookup
|
|
+
|
|
+set _search_path {}
|
|
+proc _which {what args} {
|
|
+ global env _search_exe _search_path
|
|
+
|
|
+ if {$_search_path eq {}} {
|
|
+ if {[is_Cygwin] && [regexp {^(/|\.:)} $env(PATH)]} {
|
|
+ set _search_path [split [exec cygpath \
|
|
+ --windows \
|
|
+ --path \
|
|
+ --absolute \
|
|
+ $env(PATH)] {;}]
|
|
+ set _search_exe .exe
|
|
+ } elseif {[is_Windows]} {
|
|
+ set gitguidir [file dirname [info script]]
|
|
+ regsub -all ";" $gitguidir "\\;" gitguidir
|
|
+ set env(PATH) "$gitguidir;$env(PATH)"
|
|
+ set _search_path [split $env(PATH) {;}]
|
|
+ # Skip empty `PATH` elements
|
|
+ set _search_path [lsearch -all -inline -not -exact \
|
|
+ $_search_path ""]
|
|
+ set _search_exe .exe
|
|
+ } else {
|
|
+ set _search_path [split $env(PATH) :]
|
|
+ set _search_exe {}
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if {[is_Windows] && [lsearch -exact $args -script] >= 0} {
|
|
+ set suffix {}
|
|
+ } else {
|
|
+ set suffix $_search_exe
|
|
+ }
|
|
+
|
|
+ foreach p $_search_path {
|
|
+ set p [file join $p $what$suffix]
|
|
+ if {[file exists $p]} {
|
|
+ return [file normalize $p]
|
|
+ }
|
|
+ }
|
|
+ return {}
|
|
+}
|
|
+
|
|
######################################################################
|
|
##
|
|
## locate our library
|
|
@@ -194,7 +240,6 @@ set _isbare {}
|
|
set _gitexec {}
|
|
set _githtmldir {}
|
|
set _reponame {}
|
|
-set _search_path {}
|
|
set _shellpath {@@SHELL_PATH@@}
|
|
|
|
set _trace [lsearch -exact $argv --trace]
|
|
@@ -444,47 +489,6 @@ proc _git_cmd {name} {
|
|
return $v
|
|
}
|
|
|
|
-proc _which {what args} {
|
|
- global env _search_exe _search_path
|
|
-
|
|
- if {$_search_path eq {}} {
|
|
- if {[is_Cygwin] && [regexp {^(/|\.:)} $env(PATH)]} {
|
|
- set _search_path [split [exec cygpath \
|
|
- --windows \
|
|
- --path \
|
|
- --absolute \
|
|
- $env(PATH)] {;}]
|
|
- set _search_exe .exe
|
|
- } elseif {[is_Windows]} {
|
|
- set gitguidir [file dirname [info script]]
|
|
- regsub -all ";" $gitguidir "\\;" gitguidir
|
|
- set env(PATH) "$gitguidir;$env(PATH)"
|
|
- set _search_path [split $env(PATH) {;}]
|
|
- # Skip empty `PATH` elements
|
|
- set _search_path [lsearch -all -inline -not -exact \
|
|
- $_search_path ""]
|
|
- set _search_exe .exe
|
|
- } else {
|
|
- set _search_path [split $env(PATH) :]
|
|
- set _search_exe {}
|
|
- }
|
|
- }
|
|
-
|
|
- if {[is_Windows] && [lsearch -exact $args -script] >= 0} {
|
|
- set suffix {}
|
|
- } else {
|
|
- set suffix $_search_exe
|
|
- }
|
|
-
|
|
- foreach p $_search_path {
|
|
- set p [file join $p $what$suffix]
|
|
- if {[file exists $p]} {
|
|
- return [file normalize $p]
|
|
- }
|
|
- }
|
|
- return {}
|
|
-}
|
|
-
|
|
# Test a file for a hashbang to identify executable scripts on Windows.
|
|
proc is_shellscript {filename} {
|
|
if {![file exists $filename]} {return 0}
|
|
--
|
|
2.27.0
|
|
|