env(1): unbreak build of 2_2 release branch under HEAD
authorStathis Kamperis <beket@dragonflybsd.org>
Tue, 21 Apr 2009 23:22:27 +0000 (23:22 +0000)
committerStathis Kamperis <beket@dragonflybsd.org>
Tue, 21 Apr 2009 23:31:07 +0000 (23:31 +0000)
The problem exhibits when running an old env(1), which is part of
the bootstrap tools of 2_2, in a host system with new libc/setenv(3).

When a "value=name" string is supplied to the old env(1), it doesn't
actually break it into 2 pieces (ie null terminate on '='). It just
creates two pointers, one pointing to the start of "value" and one
to the start of "name". These pointers are subsequently passed to
setenv(3). When new setenv(3) encounters the '=' character as part
of the "name", it fails with EINVAL. Which is exactly what it should
do, complying with the POSIX standard.

This patch has been tested and found to:
1) unbreak the build of 2_2 release branch under HEAD
2) not affect (i.e., break) the build of 2_2 under a 2.2 host system
3) not affect (i.e., break) the build of 2_2 under a 2.0 host system

usr.bin/env/env.c

index 468649b..8b59033 100644 (file)
@@ -65,8 +65,10 @@ main(int argc, char **argv)
                        usage();
                }
        for (argv += optind; *argv && (p = strchr(*argv, '=')); ++argv) {
-               if (setenv(*argv, ++p, 1) == -1)
-                       err(1, "setenv: cannot set %s=%s", *argv, p);
+               *p = '\0';
+               if (setenv(*argv, p + 1, 1) == -1)
+                       err(1, "setenv: cannot set %s=%s", *argv, p + 1);
+               *p = '=';
        }
 
        if (*argv) {