diff --git a/init/init.c b/init/init.c index e02773cc0..e00a3b128 100644 --- a/init/init.c +++ b/init/init.c @@ -77,14 +77,6 @@ enum { #endif }; -static const char *const environment[] = { - "HOME=/", - bb_PATH_root_path, - "SHELL=/bin/sh", - "USER=root", - NULL -}; - /* Function prototypes */ static void halt_reboot_pwoff(int sig) NORETURN; @@ -118,15 +110,16 @@ static void message(int where, const char *fmt, ...) { static int log_fd = -1; va_list arguments; - int l; + unsigned l; char msg[128]; msg[0] = '\r'; va_start(arguments, fmt); - vsnprintf(msg + 1, sizeof(msg) - 2, fmt, arguments); + l = vsnprintf(msg + 1, sizeof(msg) - 2, fmt, arguments); + if (l > sizeof(msg) - 2) + l = sizeof(msg) - 2; + msg[l] = '\0'; va_end(arguments); - msg[sizeof(msg) - 2] = '\0'; - l = strlen(msg); if (ENABLE_FEATURE_INIT_SYSLOG) { /* Log the message to syslogd */ @@ -213,6 +206,8 @@ static void console_init(void) /* Make sure fd 0,1,2 are not closed * (so that they won't be used by future opens) */ bb_sanitize_stdio(); + /* Make sure init can't be blocked by writing to stderr */ + fcntl(STDERR_FILENO, F_SETFL, fcntl(STDERR_FILENO, F_GETFL) | O_NONBLOCK); } s = getenv("TERM"); @@ -825,15 +820,15 @@ int init_main(int argc UNUSED_PARAM, char **argv) set_sane_term(); xchdir("/"); setsid(); - { - const char *const *e; - /* Make sure environs is set to something sane */ - for (e = environment; *e; e++) - putenv((char *) *e); - } + + /* Make sure environs is set to something sane */ + putenv((char *) "HOME=/"); + putenv((char *) bb_PATH_root_path); + putenv((char *) "SHELL=/bin/sh"); + putenv((char *) "USER=root"); /* needed? why? */ if (argv[1]) - setenv("RUNLEVEL", argv[1], 1); + xsetenv("RUNLEVEL", argv[1]); /* Hello world */ message(MAYBE_CONSOLE | L_LOG, "init started: %s", bb_banner); diff --git a/miscutils/crond.c b/miscutils/crond.c index 2f0bf6ea8..7d1908c63 100644 --- a/miscutils/crond.c +++ b/miscutils/crond.c @@ -187,7 +187,7 @@ int crond_main(int argc UNUSED_PARAM, char **argv) xchdir(CDir); //signal(SIGHUP, SIG_IGN); /* ? original crond dies on HUP... */ - setenv("SHELL", DEFAULT_SHELL, 1); /* once, for all future children */ + xsetenv("SHELL", DEFAULT_SHELL); /* once, for all future children */ crondlog(LVL9 "crond (busybox "BB_VER") started, log level %d", LogLevel); SynchronizeDir(); @@ -275,8 +275,8 @@ static void SetEnv(struct passwd *pas) /* if we want to set user's shell instead: */ /*safe_setenv(env_var_user, "SHELL", pas->pw_shell, 5);*/ #else - setenv("USER", pas->pw_name, 1); - setenv("HOME", pas->pw_dir, 1); + xsetenv("USER", pas->pw_name); + xsetenv("HOME", pas->pw_dir); #endif /* currently, we use constant one: */ /*setenv("SHELL", DEFAULT_SHELL, 1); - done earlier */ diff --git a/miscutils/crontab.c b/miscutils/crontab.c index f8662babb..ef6d94375 100644 --- a/miscutils/crontab.c +++ b/miscutils/crontab.c @@ -21,9 +21,9 @@ static void change_user(const struct passwd *pas) { - setenv("USER", pas->pw_name, 1); - setenv("HOME", pas->pw_dir, 1); - setenv("SHELL", DEFAULT_SHELL, 1); + xsetenv("USER", pas->pw_name); + xsetenv("HOME", pas->pw_dir); + xsetenv("SHELL", DEFAULT_SHELL); /* initgroups, setgid, setuid */ change_identity(pas); diff --git a/networking/zcip.c b/networking/zcip.c index 221edd322..f406b6c16 100644 --- a/networking/zcip.c +++ b/networking/zcip.c @@ -144,7 +144,7 @@ static int run(char *argv[3], struct in_addr *ip) if (ip) { addr = inet_ntoa(*ip); - setenv("ip", addr, 1); + xsetenv("ip", addr); fmt -= 3; } bb_info_msg(fmt, argv[1], intf, addr); @@ -238,7 +238,7 @@ int zcip_main(int argc, char **argv) intf = argv[0]; script_av[0] = argv[1]; - setenv("interface", intf, 1); + xsetenv("interface", intf); // initialize the interface (modprobe, ifup, etc) script_av[1] = (char*)"init";