submodule foreach: skip eval for more than one argument
commit1c4fb136dbad762c9c4350ee79c3474ae8037587
authorAnders Kaseorg <andersk@MIT.EDU>
Fri, 27 Sep 2013 10:23:55 +0000 (27 06:23 -0400)
committerJonathan Nieder <jrnieder@gmail.com>
Fri, 27 Sep 2013 23:06:44 +0000 (27 16:06 -0700)
treeb5a4b7d74ad1076b9ed858f8a1478adc9bb1f2cd
parent02a110ad435a6ccda648f09f94e546dfd7bdd0ac
submodule foreach: skip eval for more than one argument

'eval "$@"' creates an extra layer of shell interpretation, which is
probably not expected by a user who passes multiple arguments to git
submodule foreach:

 $ git grep "'"
 [searches for single quotes]
 $ git submodule foreach git grep "'"
 Entering '[submodule]'
 /usr/lib/git-core/git-submodule: 1: eval: Syntax error: Unterminated quoted string
 Stopping at '[submodule]'; script returned non-zero status.

To fix this, if the user passes more than one argument, execute "$@"
directly instead of passing it to eval.

Examples:

 * Typical usage when adding an extra level of quoting is to pass a
   single argument representing the entire command to be passed to the
   shell.  This doesn't change that.

 * One can imagine someone feeding untrusted input as an argument:

  git submodule foreach git grep "$variable"

   That currently results in a nonobvious shell code injection
   vulnerability.  Executing the command named by the arguments
   directly, as in this patch, fixes it.

Signed-off-by: Anders Kaseorg <andersk@mit.edu>
Acked-by: Johan Herland <johan@herland.net>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
git-submodule.sh
t/t7407-submodule-foreach.sh