Skip to content

Commit f327dbc

Browse files
distorted-mdwJunio C Hamano
authored andcommitted
Shell utilities: Guard against expr' magic tokens.
Some words, e.g., `match', are special to expr(1), and cause strange parsing effects. Track down all uses of expr and mangle the arguments so that this isn't a problem. Signed-off-by: Mark Wooding <mdw@distorted.org.uk> Signed-off-by: Junio C Hamano <junkio@cox.net>
1 parent 2283645 commit f327dbc

File tree

9 files changed

+30
-30
lines changed

9 files changed

+30
-30
lines changed

git-cherry.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ case "$1" in -v) verbose=t; shift ;; esac
2020

2121
case "$#,$1" in
2222
1,*..*)
23-
upstream=$(expr "$1" : '\(.*\)\.\.') ours=$(expr "$1" : '.*\.\.\(.*\)$')
23+
upstream=$(expr "z$1" : 'z\(.*\)\.\.') ours=$(expr "z$1" : '.*\.\.\(.*\)$')
2424
set x "$upstream" "$ours"
2525
shift ;;
2626
esac

git-clone.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,12 @@ Perhaps git-update-server-info needs to be run there?"
3838
}
3939
while read sha1 refname
4040
do
41-
name=`expr "$refname" : 'refs/\(.*\)'` &&
41+
name=`expr "z$refname" : 'zrefs/\(.*\)'` &&
4242
case "$name" in
4343
*^*) continue;;
4444
esac
4545
if test -n "$use_separate_remote" &&
46-
branch_name=`expr "$name" : 'heads/\(.*\)'`
46+
branch_name=`expr "z$name" : 'zheads/\(.*\)'`
4747
then
4848
tname="remotes/$origin/$branch_name"
4949
else
@@ -346,7 +346,7 @@ then
346346
# new style repository with a symref HEAD).
347347
# Ideally we should skip the guesswork but for now
348348
# opt for minimum change.
349-
head_sha1=`expr "$head_sha1" : 'ref: refs/heads/\(.*\)'`
349+
head_sha1=`expr "z$head_sha1" : 'zref: refs/heads/\(.*\)'`
350350
head_sha1=`cat "$GIT_DIR/$remote_top/$head_sha1"`
351351
;;
352352
esac

git-commit.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -549,8 +549,8 @@ fi >>"$GIT_DIR"/COMMIT_EDITMSG
549549
# Author
550550
if test '' != "$force_author"
551551
then
552-
GIT_AUTHOR_NAME=`expr "$force_author" : '\(.*[^ ]\) *<.*'` &&
553-
GIT_AUTHOR_EMAIL=`expr "$force_author" : '.*\(<.*\)'` &&
552+
GIT_AUTHOR_NAME=`expr "z$force_author" : 'z\(.*[^ ]\) *<.*'` &&
553+
GIT_AUTHOR_EMAIL=`expr "z$force_author" : '.*\(<.*\)'` &&
554554
test '' != "$GIT_AUTHOR_NAME" &&
555555
test '' != "$GIT_AUTHOR_EMAIL" ||
556556
die "malformatted --author parameter"

git-fetch.sh

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ append_fetch_head () {
112112
*)
113113
note_="$remote_name of " ;;
114114
esac
115-
remote_1_=$(expr "$remote_" : '\(.*\)\.git/*$') &&
115+
remote_1_=$(expr "z$remote_" : 'z\(.*\)\.git/*$') &&
116116
remote_="$remote_1_"
117117
note_="$note_$remote_"
118118

@@ -245,22 +245,22 @@ fetch_main () {
245245
246246
# These are relative path from $GIT_DIR, typically starting at refs/
247247
# but may be HEAD
248-
if expr "$ref" : '\.' >/dev/null
248+
if expr "z$ref" : 'z\.' >/dev/null
249249
then
250250
not_for_merge=t
251-
ref=$(expr "$ref" : '\.\(.*\)')
251+
ref=$(expr "z$ref" : 'z\.\(.*\)')
252252
else
253253
not_for_merge=
254254
fi
255-
if expr "$ref" : '\+' >/dev/null
255+
if expr "z$ref" : 'z\+' >/dev/null
256256
then
257257
single_force=t
258-
ref=$(expr "$ref" : '\+\(.*\)')
258+
ref=$(expr "z$ref" : 'z\+\(.*\)')
259259
else
260260
single_force=
261261
fi
262-
remote_name=$(expr "$ref" : '\([^:]*\):')
263-
local_name=$(expr "$ref" : '[^:]*:\(.*\)')
262+
remote_name=$(expr "z$ref" : 'z\([^:]*\):')
263+
local_name=$(expr "z$ref" : 'z[^:]*:\(.*\)')
264264
265265
rref="$rref$LF$remote_name"
266266
@@ -276,7 +276,7 @@ fetch_main () {
276276
print "$u";
277277
' "$remote_name")
278278
head=$(curl -nsfL $curl_extra_args "$remote/$remote_name_quoted") &&
279-
expr "$head" : "$_x40\$" >/dev/null ||
279+
expr "z$head" : "z$_x40\$" >/dev/null ||
280280
die "Failed to fetch $remote_name from $remote"
281281
echo >&2 Fetching "$remote_name from $remote" using http
282282
git-http-fetch -v -a "$head" "$remote/" || exit
@@ -362,7 +362,7 @@ fetch_main () {
362362
break ;;
363363
esac
364364
done
365-
local_name=$(expr "$found" : '[^:]*:\(.*\)')
365+
local_name=$(expr "z$found" : 'z[^:]*:\(.*\)')
366366
append_fetch_head "$sha1" "$remote" \
367367
"$remote_name" "$remote_nick" "$local_name" "$not_for_merge"
368368
done

git-format-patch.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ for revpair
126126
do
127127
case "$revpair" in
128128
?*..?*)
129-
rev1=`expr "$revpair" : '\(.*\)\.\.'`
130-
rev2=`expr "$revpair" : '.*\.\.\(.*\)'`
129+
rev1=`expr "z$revpair" : 'z\(.*\)\.\.'`
130+
rev2=`expr "z$revpair" : 'z.*\.\.\(.*\)'`
131131
;;
132132
*)
133133
rev1="$revpair^"

git-merge-one-file.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ case "${1:-.}${2:-.}${3:-.}" in
2626
fi
2727
if test -f "$4"; then
2828
rm -f -- "$4" &&
29-
rmdir -p "$(expr "$4" : '\(.*\)/')" 2>/dev/null || :
29+
rmdir -p "$(expr "z$4" : 'z\(.*\)/')" 2>/dev/null || :
3030
fi &&
3131
exec git-update-index --remove -- "$4"
3232
;;

git-parse-remote.sh

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ get_data_source () {
88
case "$1" in
99
*/*)
1010
# Not so fast. This could be the partial URL shorthand...
11-
token=$(expr "$1" : '\([^/]*\)/')
12-
remainder=$(expr "$1" : '[^/]*/\(.*\)')
11+
token=$(expr "z$1" : 'z\([^/]*\)/')
12+
remainder=$(expr "z$1" : 'z[^/]*/\(.*\)')
1313
if test -f "$GIT_DIR/branches/$token"
1414
then
1515
echo branches-partial
@@ -43,8 +43,8 @@ get_remote_url () {
4343
branches)
4444
sed -e 's/#.*//' "$GIT_DIR/branches/$1" ;;
4545
branches-partial)
46-
token=$(expr "$1" : '\([^/]*\)/')
47-
remainder=$(expr "$1" : '[^/]*/\(.*\)')
46+
token=$(expr "z$1" : 'z\([^/]*\)/')
47+
remainder=$(expr "z$1" : 'z[^/]*/\(.*\)')
4848
url=$(sed -e 's/#.*//' "$GIT_DIR/branches/$token")
4949
echo "$url/$remainder"
5050
;;
@@ -77,13 +77,13 @@ canon_refs_list_for_fetch () {
7777
force=
7878
case "$ref" in
7979
+*)
80-
ref=$(expr "$ref" : '\+\(.*\)')
80+
ref=$(expr "z$ref" : 'z\+\(.*\)')
8181
force=+
8282
;;
8383
esac
84-
expr "$ref" : '.*:' >/dev/null || ref="${ref}:"
85-
remote=$(expr "$ref" : '\([^:]*\):')
86-
local=$(expr "$ref" : '[^:]*:\(.*\)')
84+
expr "z$ref" : 'z.*:' >/dev/null || ref="${ref}:"
85+
remote=$(expr "z$ref" : 'z\([^:]*\):')
86+
local=$(expr "z$ref" : 'z[^:]*:\(.*\)')
8787
case "$remote" in
8888
'') remote=HEAD ;;
8989
refs/heads/* | refs/tags/* | refs/remotes/*) ;;
@@ -97,7 +97,7 @@ canon_refs_list_for_fetch () {
9797
*) local="refs/heads/$local" ;;
9898
esac
9999

100-
if local_ref_name=$(expr "$local" : 'refs/\(.*\)')
100+
if local_ref_name=$(expr "z$local" : 'zrefs/\(.*\)')
101101
then
102102
git-check-ref-format "$local_ref_name" ||
103103
die "* refusing to create funny ref '$local_ref_name' locally"
@@ -171,7 +171,7 @@ get_remote_refs_for_fetch () {
171171

172172
resolve_alternates () {
173173
# original URL (xxx.git)
174-
top_=`expr "$1" : '\([^:]*:/*[^/]*\)/'`
174+
top_=`expr "z$1" : 'z\([^:]*:/*[^/]*\)/'`
175175
while read path
176176
do
177177
case "$path" in

git-rebase.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ case "$#" in
9494
;;
9595
*)
9696
branch_name=`git symbolic-ref HEAD` || die "No current branch"
97-
branch_name=`expr "$branch_name" : 'refs/heads/\(.*\)'`
97+
branch_name=`expr "z$branch_name" : 'zrefs/heads/\(.*\)'`
9898
;;
9999
esac
100100
branch=$(git-rev-parse --verify "${branch_name}^0") || exit

git-tag.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ git-check-ref-format "tags/$name" ||
7575
object=$(git-rev-parse --verify --default HEAD "$@") || exit 1
7676
type=$(git-cat-file -t $object) || exit 1
7777
tagger=$(git-var GIT_COMMITTER_IDENT) || exit 1
78-
: ${username:=$(expr "$tagger" : '\(.*>\)')}
78+
: ${username:=$(expr "z$tagger" : 'z\(.*>\)')}
7979

8080
trap 'rm -f "$GIT_DIR"/TAG_TMP* "$GIT_DIR"/TAG_FINALMSG "$GIT_DIR"/TAG_EDITMSG' 0
8181

0 commit comments

Comments
 (0)