From 0e037b8c45db499e199299cb8079aaa8b5c45371 Mon Sep 17 00:00:00 2001 From: Avery Pennarun Date: Sat, 5 Mar 2011 18:48:27 -0800 Subject: [PATCH] minimal/do: leak fewer variables, especially PREFIX. Since we use ". filename.do" to run the .do files instead of just "filename.do", shell local variables end up being inherited by the subprogram. Change all the local variables to be all lowercase, to avoid conflicting with any typical environment variables someone might use. The particular variable that triggered this was PREFIX (reported by "ulrik" on the mailing list) and that fixes this, at least. Arguably we shouldn't be using ".", but using it avoids unnecessary forks, which is kind of nice. --- minimal/do | 88 +++++++++++++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/minimal/do b/minimal/do index 5bde592..fdd2bf6 100755 --- a/minimal/do +++ b/minimal/do @@ -8,14 +8,14 @@ # # By default, no output coloring. -GREEN="" -BOLD="" -PLAIN="" +green="" +bold="" +plain="" if [ -n "$TERM" -a "$TERM" != "dumb" ] && tty <&2 >/dev/null 2>&1; then - GREEN="$(printf '\033[32m')" - BOLD="$(printf '\033[1m')" - PLAIN="$(printf '\033[m')" + green="$(printf '\033[32m')" + bold="$(printf '\033[1m')" + plain="$(printf '\033[m')" fi _dirsplit() @@ -54,78 +54,78 @@ fi _find_dofile_pwd() { - DOFILE=default.$1.do + dofile=default.$1.do while :; do - DOFILE=default.${DOFILE#default.*.} - [ -e "$DOFILE" -o "$DOFILE" = default.do ] && break + dofile=default.${dofile#default.*.} + [ -e "$dofile" -o "$dofile" = default.do ] && break done - EXT=${DOFILE#default} - EXT=${EXT%.do} - BASE=${1%$EXT} + ext=${dofile#default} + ext=${ext%.do} + base=${1%$ext} } _find_dofile() { - PREFIX= + local prefix= while :; do _find_dofile_pwd "$1" - [ -e "$DOFILE" ] && break + [ -e "$dofile" ] && break [ "$PWD" = "/" ] && break - TARGET=${PWD##*/}/$TARGET - PREFIX=${PWD##*/}/$PREFIX + target=${PWD##*/}/$target + prefix=${PWD##*/}/$prefix cd .. done - BASE=$PREFIX$BASE + base=$prefix$base } _run_dofile() { export DO_DEPTH="$DO_DEPTH " - export REDO_TARGET=$PWD/$TARGET + export REDO_TARGET=$PWD/$target + local line1 set -e - read line1 <"$PWD/$DOFILE" + read line1 <"$PWD/$dofile" cmd=${line1#"#!/"} if [ "$cmd" != "$line1" ]; then - /$cmd "$PWD/$DOFILE" "$@" >"$TARGET.tmp2" + /$cmd "$PWD/$dofile" "$@" >"$target.tmp2" else - :; . "$PWD/$DOFILE" >"$TARGET.tmp2" + :; . "$PWD/$dofile" >"$target.tmp2" fi } _do() { - DIR=$1 - TARGET=$2 - if [ ! -e "$TARGET" ] || [ -d "$TARGET/." -a ! -e "$TARGET.did" ]; then + local dir=$1 target=$2 + if [ ! -e "$target" ] || [ -d "$target/." -a ! -e "$target.did" ]; then printf '%sdo %s%s%s%s\n' \ - "$GREEN" "$DO_DEPTH" "$BOLD" "$DIR$TARGET" "$PLAIN" >&2 - echo "$PWD/$TARGET" >>"$DO_BUILT" - DOFILE=$TARGET.do - BASE=$TARGET - EXT= - [ -e "$TARGET.do" ] || _find_dofile "$TARGET" - if [ ! -e "$DOFILE" ]; then - echo "do: $TARGET: no .do file" >&2 + "$green" "$DO_DEPTH" "$bold" "$dir$target" "$plain" >&2 + echo "$PWD/$target" >>"$DO_BUILT" + dofile=$target.do + base=$target + ext= + [ -e "$target.do" ] || _find_dofile "$target" + if [ ! -e "$dofile" ]; then + echo "do: $target: no .do file" >&2 return 1 fi - [ ! -e "$DO_BUILD" ] || : >>"$TARGET.did" - ( _run_dofile "$BASE" "$EXT" "$TARGET.tmp" ) - RV=$? - if [ $RV != 0 ]; then + [ ! -e "$DO_BUILD" ] || : >>"$target.did" + ( _run_dofile "$base" "$ext" "$target.tmp" ) + rv=$? + if [ $rv != 0 ]; then printf "do: %s%s\n" "$DO_DEPTH" \ - "$DIR$TARGET: got exit code $RV" >&2 - rm -f "$TARGET.tmp" "$TARGET.tmp2" - return $RV + "$dir$target: got exit code $rv" >&2 + rm -f "$target.tmp" "$target.tmp2" + return $rv fi - mv "$TARGET.tmp" "$TARGET" 2>/dev/null || - ! test -s "$TARGET.tmp2" || - mv "$TARGET.tmp2" "$TARGET" 2>/dev/null - rm -f "$TARGET.tmp2" + mv "$target.tmp" "$target" 2>/dev/null || + ! test -s "$target.tmp2" || + mv "$target.tmp2" "$target" 2>/dev/null + rm -f "$target.tmp2" else - echo "do $DO_DEPTH$TARGET exists." >&2 + echo "do $DO_DEPTH$target exists." >&2 fi }