[git commit master] env: don't SEGV on bare "env -"

Denys Vlasenko vda.linux at googlemail.com
Thu Nov 12 13:52:47 UTC 2009


commit: http://git.busybox.net/busybox/commit/?id=f4fee418ae9f5308b4d32bc8d4e618f779f3203f
branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 coreutils/env.c |   18 ++++++++++--------
 1 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/coreutils/env.c b/coreutils/env.c
index f50a03e..9635d2b 100644
--- a/coreutils/env.c
+++ b/coreutils/env.c
@@ -43,21 +43,20 @@ static const char env_longopts[] ALIGN1 =
 int env_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int env_main(int argc UNUSED_PARAM, char **argv)
 {
-	char **ep;
-	unsigned opt;
+	unsigned opts;
 	llist_t *unset_env = NULL;
 
 	opt_complementary = "u::";
 #if ENABLE_FEATURE_ENV_LONG_OPTIONS
 	applet_long_options = env_longopts;
 #endif
-	opt = getopt32(argv, "+iu:", &unset_env);
+	opts = getopt32(argv, "+iu:", &unset_env);
 	argv += optind;
-	if (*argv && LONE_DASH(argv[0])) {
-		opt |= 1;
+	if (argv[0] && LONE_DASH(argv[0])) {
+		opts |= 1;
 		++argv;
 	}
-	if (opt & 1) {
+	if (opts & 1) {
 		clearenv();
 	}
 	while (unset_env) {
@@ -84,8 +83,11 @@ int env_main(int argc UNUSED_PARAM, char **argv)
 		bb_simple_perror_msg_and_die(*argv);
 	}
 
-	for (ep = environ; *ep; ep++) {
-		puts(*ep);
+	if (environ) { /* clearenv() may set environ == NULL! */
+		char **ep;
+		for (ep = environ; *ep; ep++) {
+			puts(*ep);
+		}
 	}
 
 	fflush_stdout_and_exit(EXIT_SUCCESS);
-- 
1.6.3.3



More information about the busybox-cvs mailing list