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>maint
parent
2283645b85
commit
f327dbced2
|
@ -20,7 +20,7 @@ case "$1" in -v) verbose=t; shift ;; esac
|
||||||
|
|
||||||
case "$#,$1" in
|
case "$#,$1" in
|
||||||
1,*..*)
|
1,*..*)
|
||||||
upstream=$(expr "$1" : '\(.*\)\.\.') ours=$(expr "$1" : '.*\.\.\(.*\)$')
|
upstream=$(expr "z$1" : 'z\(.*\)\.\.') ours=$(expr "z$1" : '.*\.\.\(.*\)$')
|
||||||
set x "$upstream" "$ours"
|
set x "$upstream" "$ours"
|
||||||
shift ;;
|
shift ;;
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -38,12 +38,12 @@ Perhaps git-update-server-info needs to be run there?"
|
||||||
}
|
}
|
||||||
while read sha1 refname
|
while read sha1 refname
|
||||||
do
|
do
|
||||||
name=`expr "$refname" : 'refs/\(.*\)'` &&
|
name=`expr "z$refname" : 'zrefs/\(.*\)'` &&
|
||||||
case "$name" in
|
case "$name" in
|
||||||
*^*) continue;;
|
*^*) continue;;
|
||||||
esac
|
esac
|
||||||
if test -n "$use_separate_remote" &&
|
if test -n "$use_separate_remote" &&
|
||||||
branch_name=`expr "$name" : 'heads/\(.*\)'`
|
branch_name=`expr "z$name" : 'zheads/\(.*\)'`
|
||||||
then
|
then
|
||||||
tname="remotes/$origin/$branch_name"
|
tname="remotes/$origin/$branch_name"
|
||||||
else
|
else
|
||||||
|
@ -346,7 +346,7 @@ then
|
||||||
# new style repository with a symref HEAD).
|
# new style repository with a symref HEAD).
|
||||||
# Ideally we should skip the guesswork but for now
|
# Ideally we should skip the guesswork but for now
|
||||||
# opt for minimum change.
|
# opt for minimum change.
|
||||||
head_sha1=`expr "$head_sha1" : 'ref: refs/heads/\(.*\)'`
|
head_sha1=`expr "z$head_sha1" : 'zref: refs/heads/\(.*\)'`
|
||||||
head_sha1=`cat "$GIT_DIR/$remote_top/$head_sha1"`
|
head_sha1=`cat "$GIT_DIR/$remote_top/$head_sha1"`
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -549,8 +549,8 @@ fi >>"$GIT_DIR"/COMMIT_EDITMSG
|
||||||
# Author
|
# Author
|
||||||
if test '' != "$force_author"
|
if test '' != "$force_author"
|
||||||
then
|
then
|
||||||
GIT_AUTHOR_NAME=`expr "$force_author" : '\(.*[^ ]\) *<.*'` &&
|
GIT_AUTHOR_NAME=`expr "z$force_author" : 'z\(.*[^ ]\) *<.*'` &&
|
||||||
GIT_AUTHOR_EMAIL=`expr "$force_author" : '.*\(<.*\)'` &&
|
GIT_AUTHOR_EMAIL=`expr "z$force_author" : '.*\(<.*\)'` &&
|
||||||
test '' != "$GIT_AUTHOR_NAME" &&
|
test '' != "$GIT_AUTHOR_NAME" &&
|
||||||
test '' != "$GIT_AUTHOR_EMAIL" ||
|
test '' != "$GIT_AUTHOR_EMAIL" ||
|
||||||
die "malformatted --author parameter"
|
die "malformatted --author parameter"
|
||||||
|
|
18
git-fetch.sh
18
git-fetch.sh
|
@ -112,7 +112,7 @@ append_fetch_head () {
|
||||||
*)
|
*)
|
||||||
note_="$remote_name of " ;;
|
note_="$remote_name of " ;;
|
||||||
esac
|
esac
|
||||||
remote_1_=$(expr "$remote_" : '\(.*\)\.git/*$') &&
|
remote_1_=$(expr "z$remote_" : 'z\(.*\)\.git/*$') &&
|
||||||
remote_="$remote_1_"
|
remote_="$remote_1_"
|
||||||
note_="$note_$remote_"
|
note_="$note_$remote_"
|
||||||
|
|
||||||
|
@ -245,22 +245,22 @@ fetch_main () {
|
||||||
|
|
||||||
# These are relative path from $GIT_DIR, typically starting at refs/
|
# These are relative path from $GIT_DIR, typically starting at refs/
|
||||||
# but may be HEAD
|
# but may be HEAD
|
||||||
if expr "$ref" : '\.' >/dev/null
|
if expr "z$ref" : 'z\.' >/dev/null
|
||||||
then
|
then
|
||||||
not_for_merge=t
|
not_for_merge=t
|
||||||
ref=$(expr "$ref" : '\.\(.*\)')
|
ref=$(expr "z$ref" : 'z\.\(.*\)')
|
||||||
else
|
else
|
||||||
not_for_merge=
|
not_for_merge=
|
||||||
fi
|
fi
|
||||||
if expr "$ref" : '\+' >/dev/null
|
if expr "z$ref" : 'z\+' >/dev/null
|
||||||
then
|
then
|
||||||
single_force=t
|
single_force=t
|
||||||
ref=$(expr "$ref" : '\+\(.*\)')
|
ref=$(expr "z$ref" : 'z\+\(.*\)')
|
||||||
else
|
else
|
||||||
single_force=
|
single_force=
|
||||||
fi
|
fi
|
||||||
remote_name=$(expr "$ref" : '\([^:]*\):')
|
remote_name=$(expr "z$ref" : 'z\([^:]*\):')
|
||||||
local_name=$(expr "$ref" : '[^:]*:\(.*\)')
|
local_name=$(expr "z$ref" : 'z[^:]*:\(.*\)')
|
||||||
|
|
||||||
rref="$rref$LF$remote_name"
|
rref="$rref$LF$remote_name"
|
||||||
|
|
||||||
|
@ -276,7 +276,7 @@ fetch_main () {
|
||||||
print "$u";
|
print "$u";
|
||||||
' "$remote_name")
|
' "$remote_name")
|
||||||
head=$(curl -nsfL $curl_extra_args "$remote/$remote_name_quoted") &&
|
head=$(curl -nsfL $curl_extra_args "$remote/$remote_name_quoted") &&
|
||||||
expr "$head" : "$_x40\$" >/dev/null ||
|
expr "z$head" : "z$_x40\$" >/dev/null ||
|
||||||
die "Failed to fetch $remote_name from $remote"
|
die "Failed to fetch $remote_name from $remote"
|
||||||
echo >&2 Fetching "$remote_name from $remote" using http
|
echo >&2 Fetching "$remote_name from $remote" using http
|
||||||
git-http-fetch -v -a "$head" "$remote/" || exit
|
git-http-fetch -v -a "$head" "$remote/" || exit
|
||||||
|
@ -362,7 +362,7 @@ fetch_main () {
|
||||||
break ;;
|
break ;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
local_name=$(expr "$found" : '[^:]*:\(.*\)')
|
local_name=$(expr "z$found" : 'z[^:]*:\(.*\)')
|
||||||
append_fetch_head "$sha1" "$remote" \
|
append_fetch_head "$sha1" "$remote" \
|
||||||
"$remote_name" "$remote_nick" "$local_name" "$not_for_merge"
|
"$remote_name" "$remote_nick" "$local_name" "$not_for_merge"
|
||||||
done
|
done
|
||||||
|
|
|
@ -126,8 +126,8 @@ for revpair
|
||||||
do
|
do
|
||||||
case "$revpair" in
|
case "$revpair" in
|
||||||
?*..?*)
|
?*..?*)
|
||||||
rev1=`expr "$revpair" : '\(.*\)\.\.'`
|
rev1=`expr "z$revpair" : 'z\(.*\)\.\.'`
|
||||||
rev2=`expr "$revpair" : '.*\.\.\(.*\)'`
|
rev2=`expr "z$revpair" : 'z.*\.\.\(.*\)'`
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
rev1="$revpair^"
|
rev1="$revpair^"
|
||||||
|
|
|
@ -26,7 +26,7 @@ case "${1:-.}${2:-.}${3:-.}" in
|
||||||
fi
|
fi
|
||||||
if test -f "$4"; then
|
if test -f "$4"; then
|
||||||
rm -f -- "$4" &&
|
rm -f -- "$4" &&
|
||||||
rmdir -p "$(expr "$4" : '\(.*\)/')" 2>/dev/null || :
|
rmdir -p "$(expr "z$4" : 'z\(.*\)/')" 2>/dev/null || :
|
||||||
fi &&
|
fi &&
|
||||||
exec git-update-index --remove -- "$4"
|
exec git-update-index --remove -- "$4"
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -8,8 +8,8 @@ get_data_source () {
|
||||||
case "$1" in
|
case "$1" in
|
||||||
*/*)
|
*/*)
|
||||||
# Not so fast. This could be the partial URL shorthand...
|
# Not so fast. This could be the partial URL shorthand...
|
||||||
token=$(expr "$1" : '\([^/]*\)/')
|
token=$(expr "z$1" : 'z\([^/]*\)/')
|
||||||
remainder=$(expr "$1" : '[^/]*/\(.*\)')
|
remainder=$(expr "z$1" : 'z[^/]*/\(.*\)')
|
||||||
if test -f "$GIT_DIR/branches/$token"
|
if test -f "$GIT_DIR/branches/$token"
|
||||||
then
|
then
|
||||||
echo branches-partial
|
echo branches-partial
|
||||||
|
@ -43,8 +43,8 @@ get_remote_url () {
|
||||||
branches)
|
branches)
|
||||||
sed -e 's/#.*//' "$GIT_DIR/branches/$1" ;;
|
sed -e 's/#.*//' "$GIT_DIR/branches/$1" ;;
|
||||||
branches-partial)
|
branches-partial)
|
||||||
token=$(expr "$1" : '\([^/]*\)/')
|
token=$(expr "z$1" : 'z\([^/]*\)/')
|
||||||
remainder=$(expr "$1" : '[^/]*/\(.*\)')
|
remainder=$(expr "z$1" : 'z[^/]*/\(.*\)')
|
||||||
url=$(sed -e 's/#.*//' "$GIT_DIR/branches/$token")
|
url=$(sed -e 's/#.*//' "$GIT_DIR/branches/$token")
|
||||||
echo "$url/$remainder"
|
echo "$url/$remainder"
|
||||||
;;
|
;;
|
||||||
|
@ -77,13 +77,13 @@ canon_refs_list_for_fetch () {
|
||||||
force=
|
force=
|
||||||
case "$ref" in
|
case "$ref" in
|
||||||
+*)
|
+*)
|
||||||
ref=$(expr "$ref" : '\+\(.*\)')
|
ref=$(expr "z$ref" : 'z\+\(.*\)')
|
||||||
force=+
|
force=+
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
expr "$ref" : '.*:' >/dev/null || ref="${ref}:"
|
expr "z$ref" : 'z.*:' >/dev/null || ref="${ref}:"
|
||||||
remote=$(expr "$ref" : '\([^:]*\):')
|
remote=$(expr "z$ref" : 'z\([^:]*\):')
|
||||||
local=$(expr "$ref" : '[^:]*:\(.*\)')
|
local=$(expr "z$ref" : 'z[^:]*:\(.*\)')
|
||||||
case "$remote" in
|
case "$remote" in
|
||||||
'') remote=HEAD ;;
|
'') remote=HEAD ;;
|
||||||
refs/heads/* | refs/tags/* | refs/remotes/*) ;;
|
refs/heads/* | refs/tags/* | refs/remotes/*) ;;
|
||||||
|
@ -97,7 +97,7 @@ canon_refs_list_for_fetch () {
|
||||||
*) local="refs/heads/$local" ;;
|
*) local="refs/heads/$local" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if local_ref_name=$(expr "$local" : 'refs/\(.*\)')
|
if local_ref_name=$(expr "z$local" : 'zrefs/\(.*\)')
|
||||||
then
|
then
|
||||||
git-check-ref-format "$local_ref_name" ||
|
git-check-ref-format "$local_ref_name" ||
|
||||||
die "* refusing to create funny ref '$local_ref_name' locally"
|
die "* refusing to create funny ref '$local_ref_name' locally"
|
||||||
|
@ -171,7 +171,7 @@ get_remote_refs_for_fetch () {
|
||||||
|
|
||||||
resolve_alternates () {
|
resolve_alternates () {
|
||||||
# original URL (xxx.git)
|
# original URL (xxx.git)
|
||||||
top_=`expr "$1" : '\([^:]*:/*[^/]*\)/'`
|
top_=`expr "z$1" : 'z\([^:]*:/*[^/]*\)/'`
|
||||||
while read path
|
while read path
|
||||||
do
|
do
|
||||||
case "$path" in
|
case "$path" in
|
||||||
|
|
|
@ -94,7 +94,7 @@ case "$#" in
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
branch_name=`git symbolic-ref HEAD` || die "No current branch"
|
branch_name=`git symbolic-ref HEAD` || die "No current branch"
|
||||||
branch_name=`expr "$branch_name" : 'refs/heads/\(.*\)'`
|
branch_name=`expr "z$branch_name" : 'zrefs/heads/\(.*\)'`
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
branch=$(git-rev-parse --verify "${branch_name}^0") || exit
|
branch=$(git-rev-parse --verify "${branch_name}^0") || exit
|
||||||
|
|
|
@ -75,7 +75,7 @@ git-check-ref-format "tags/$name" ||
|
||||||
object=$(git-rev-parse --verify --default HEAD "$@") || exit 1
|
object=$(git-rev-parse --verify --default HEAD "$@") || exit 1
|
||||||
type=$(git-cat-file -t $object) || exit 1
|
type=$(git-cat-file -t $object) || exit 1
|
||||||
tagger=$(git-var GIT_COMMITTER_IDENT) || exit 1
|
tagger=$(git-var GIT_COMMITTER_IDENT) || exit 1
|
||||||
: ${username:=$(expr "$tagger" : '\(.*>\)')}
|
: ${username:=$(expr "z$tagger" : 'z\(.*>\)')}
|
||||||
|
|
||||||
trap 'rm -f "$GIT_DIR"/TAG_TMP* "$GIT_DIR"/TAG_FINALMSG "$GIT_DIR"/TAG_EDITMSG' 0
|
trap 'rm -f "$GIT_DIR"/TAG_TMP* "$GIT_DIR"/TAG_FINALMSG "$GIT_DIR"/TAG_EDITMSG' 0
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue