On Sat, Nov 11, 2017 at 08:03:36PM +0000, Robert Peichaer wrote:
> On Sat, Nov 11, 2017 at 08:11:25PM +0100, Klemens Nanni wrote:
> > pre_path()ing directories with spaces is broken due to bad quoting.
> >
> > This diff takes care of that by properly passing double quotes through
> > eval and quoting the arguments for no_path() individually.
> >
> > Feedback?
>
> What is actually broken?
> Can you give examples?
Sure, pardon me.
$ typeset -f add_path
function add_path {
[[ -d ${1:-.} ]] && no_path $* && eval ${2:-PATH}="\$${2:-PATH}:$1"
}
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
$ mkdir some\ bin
$ add_path some\ bin
add_path: bin: not found
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
$ PATH=$PATH:some\ bin
$ del_path some\ bin
$ echo $?
0
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:some bin/
Since the double quotes are not escaped and thus quote the string to be
evaluated itself, `PATH=$PATH:some bin' is eventually being executed as
seen above.
pre_path() behaves the same trying to execute `PATH=some bin:$PATH'.
del_path() silently fails to remove the directory.
Here's another example showing how to exploit this:
$ ls foo
ls: foo: No such file or directory
$ mkdir '. touch foo'
$ add_path '. touch foo'
$ ls foo
foo
With my patch behaviour will be as expected.