env: don't SEGV on bare "env -"
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 12 Nov 2009 13:52:47 +0000 (14:52 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 12 Nov 2009 13:52:47 +0000 (14:52 +0100)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
coreutils/env.c

index f50a03e8b683b868f2fdf05d22f428208a3f52e8..9635d2b22aa580b9aaa290b610f582e8ccc35efa 100644 (file)
@@ -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);