On Sun, Jan 11, 2015 at 9:36 AM, Ted Unangst <[email protected]> wrote:
> env won't run a command with an = in its name. This is documented as a
> bug, but it's easily fixed in a backwards compatible way.
...
> +       if (strcmp(*argv, "--") == 0)
> +               argv++;

No, "env foo=bar -- baz=qux" really should try to execute "--": the
enviroment variables aren't an option string being processed with
getopt().

What we *can* do is enforce a bit more this requirement on environment names:
    In the shell command language, a word consisting solely of
underscores, digits, and alphabetics
    from the portable character set. The first character of a name is
not a digit.

Slash is not legal in shell variable names, so if we treat an argument
containing a slash before the = as the command instead of a variable
assignment, users have an escape hatch a do something like:
    env foo=bar ./my=cool=program
or
    env foo=bar `which another=test`

etc.

Something like this on the code side?

PHilip

--- env.c       8 Mar 2014 00:09:20 -0000       1.15
+++ env.c       11 Jan 2015 19:20:36 -0000
@@ -63,6 +63,8 @@ main(int argc, char *argv[])
        argv += optind;

        for (; *argv && (p = strchr(*argv, '=')); ++argv) {
+               if (memchr(*argv, '/', p - *argv) != NULL)
+                       break;
                *p++ = '\0';
                if (setenv(*argv, p, 1) == -1) {
                        /* reuse 126, it matches the problem most */

Reply via email to