From: Stathis Kamperis Date: Tue, 21 Apr 2009 23:22:27 +0000 (+0000) Subject: env(1): unbreak build of 2_2 release branch under HEAD X-Git-Tag: v2.2.1~11 X-Git-Url: http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/31e17398948035bd0ce33d814c7a1e587995243a env(1): unbreak build of 2_2 release branch under HEAD 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 --- diff --git a/usr.bin/env/env.c b/usr.bin/env/env.c index 468649b..8b59033 100644 --- a/usr.bin/env/env.c +++ b/usr.bin/env/env.c @@ -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) {