diff --git a/include/libbb.h b/include/libbb.h index 13303073d..7ee66dce6 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -397,6 +397,7 @@ extern const char *msg_eol; extern int logmode; extern int die_sleep; extern int xfunc_error_retval; +extern void sleep_and_die(void) ATTRIBUTE_NORETURN; extern void bb_show_usage(void) ATTRIBUTE_NORETURN ATTRIBUTE_EXTERNALLY_VISIBLE; extern void bb_error_msg(const char *s, ...) __attribute__ ((format (printf, 1, 2))); extern void bb_error_msg_and_die(const char *s, ...) __attribute__ ((noreturn, format (printf, 1, 2))); diff --git a/init/init.c b/init/init.c index 2e8ca3ca8..6fc68afb1 100644 --- a/init/init.c +++ b/init/init.c @@ -19,7 +19,7 @@ #include "init_shared.h" -#ifdef CONFIG_SYSLOGD +#if ENABLE_SYSLOGD # include #endif @@ -60,7 +60,7 @@ struct serial_struct { #define _PATH_STDPATH "/usr/bin:/bin:/usr/sbin:/sbin" #endif -#if defined CONFIG_FEATURE_INIT_COREDUMPS +#if ENABLE_FEATURE_INIT_COREDUMPS /* * When a file named CORE_ENABLE_FLAG_FILE exists, setrlimit is called * before processes are spawned to set core file size as unlimited. @@ -121,7 +121,7 @@ struct init_action { static struct init_action *init_action_list = NULL; static char console[CONSOLE_BUFF_SIZE] = CONSOLE_DEV; -#ifndef CONFIG_SYSLOGD +#if !ENABLE_SYSLOGD static char *log_console = VC_5; #endif #if !ENABLE_DEBUG_INIT @@ -132,7 +132,7 @@ enum { LOG = 0x1, CONSOLE = 0x2, -#if defined CONFIG_FEATURE_EXTRA_QUIET +#if ENABLE_FEATURE_EXTRA_QUIET MAYBE_CONSOLE = 0x0, #else MAYBE_CONSOLE = CONSOLE, @@ -162,11 +162,13 @@ static int waitfor(const struct init_action *a, pid_t pid); static void shutdown_signal(int sig); #endif +#if !ENABLE_DEBUG_INIT static void loop_forever(void) { while (1) sleep(1); } +#endif /* Print a message to the specified device. * Device may be bitwise-or'd from LOG | CONSOLE */ @@ -182,7 +184,7 @@ static void message(int device, const char *fmt, ...) va_list arguments; int l; RESERVE_CONFIG_BUFFER(msg, 1024); -#ifndef CONFIG_SYSLOGD +#if !ENABLE_SYSLOGD static int log_fd = -1; #endif @@ -191,7 +193,7 @@ static void message(int device, const char *fmt, ...) l = vsnprintf(msg + 1, 1024 - 2, fmt, arguments) + 1; va_end(arguments); -#ifdef CONFIG_SYSLOGD +#if ENABLE_SYSLOGD /* Log the message to syslogd */ if (device & LOG) { /* don`t out "\r\n" */ @@ -313,7 +315,7 @@ static void console_init(void) } if (fd < 0) { /* Perhaps we should panic here? */ -#ifndef CONFIG_SYSLOGD +#if !ENABLE_SYSLOGD log_console = #endif safe_strncpy(console, bb_dev_null, sizeof(console)); @@ -325,7 +327,7 @@ static void console_init(void) * if TERM is set to linux (the default) */ if (s == NULL || strcmp(s, "linux") == 0) putenv("TERM=vt102"); -#ifndef CONFIG_SYSLOGD +#if !ENABLE_SYSLOGD log_console = console; #endif } else { @@ -510,7 +512,7 @@ static pid_t run(const struct init_action *a) cmd[0][0] = '-'; strcpy(cmd[0] + 1, s); } -#ifdef CONFIG_FEATURE_INIT_SCTTY +#if ENABLE_FEATURE_INIT_SCTTY /* Establish this process as session leader and * (attempt) to make the tty (if any) a controlling tty. */ @@ -543,7 +545,7 @@ static pid_t run(const struct init_action *a) message(LOG, "Starting pid %d, console %s: '%s'", getpid(), a->terminal, cmdpath); -#if defined CONFIG_FEATURE_INIT_COREDUMPS +#if ENABLE_FEATURE_INIT_COREDUMPS { struct stat sb; if (stat(CORE_ENABLE_FLAG_FILE, &sb) == 0) { @@ -622,11 +624,12 @@ static void init_reboot(unsigned long magic) /* We have to fork here, since the kernel calls do_exit(0) in * linux/kernel/sys.c, which can cause the machine to panic when * the init process is killed.... */ - if ((pid = fork()) == 0) { + pid = vfork(); + if (pid == 0) { /* child */ reboot(magic); _exit(0); } - waitpid (pid, NULL, 0); + waitpid(pid, NULL, 0); } static void shutdown_system(void) @@ -746,7 +749,6 @@ static void shutdown_signal(int sig) sleep(2); init_reboot(rb); - loop_forever(); } @@ -785,11 +787,7 @@ static void new_init_action(int action, const char *command, const char *cons) if (strcmp(cons, bb_dev_null) == 0 && (action & ASKFIRST)) return; - new_action = calloc((size_t) (1), sizeof(struct init_action)); - if (!new_action) { - message(LOG | CONSOLE, "Memory allocation failure"); - loop_forever(); - } + new_action = xzalloc(sizeof(struct init_action)); /* Append to the end of the list */ for (a = last = init_action_list; a; a = a->next) { @@ -841,7 +839,7 @@ static void delete_init_action(struct init_action *action) */ static void parse_inittab(void) { -#ifdef CONFIG_FEATURE_USE_INITTAB +#if ENABLE_FEATURE_USE_INITTAB FILE *file; char buf[INIT_BUFFS_SIZE], lineAsRead[INIT_BUFFS_SIZE]; char tmpConsole[CONSOLE_BUFF_SIZE]; @@ -870,7 +868,7 @@ static void parse_inittab(void) new_init_action(SYSINIT, INIT_SCRIPT, ""); return; -#ifdef CONFIG_FEATURE_USE_INITTAB +#if ENABLE_FEATURE_USE_INITTAB } while (fgets(buf, INIT_BUFFS_SIZE, file) != NULL) { @@ -941,10 +939,10 @@ static void parse_inittab(void) } fclose(file); return; -#endif /* CONFIG_FEATURE_USE_INITTAB */ +#endif /* FEATURE_USE_INITTAB */ } -#ifdef CONFIG_FEATURE_USE_INITTAB +#if ENABLE_FEATURE_USE_INITTAB static void reload_signal(int sig ATTRIBUTE_UNUSED) { struct init_action *a, *tmp; @@ -969,13 +967,15 @@ static void reload_signal(int sig ATTRIBUTE_UNUSED) run_actions(RESPAWN); return; } -#endif /* CONFIG_FEATURE_USE_INITTAB */ +#endif /* FEATURE_USE_INITTAB */ int init_main(int argc, char **argv) { struct init_action *a; pid_t wpid; + die_sleep = 30 * 24*60*60; /* if xmalloc will ever die... */ + if (argc > 1 && !strcmp(argv[1], "-q")) { return kill(1,SIGHUP); } @@ -1062,7 +1062,7 @@ int init_main(int argc, char **argv) parse_inittab(); } -#ifdef CONFIG_SELINUX +#if ENABLE_SELINUX if (getenv("SELINUX_INIT") == NULL) { int enforce = 0; @@ -1092,12 +1092,12 @@ int init_main(int argc, char **argv) /* Next run anything to be run only once */ run_actions(ONCE); -#ifdef CONFIG_FEATURE_USE_INITTAB +#if ENABLE_FEATURE_USE_INITTAB /* Redefine SIGHUP to reread /etc/inittab */ signal(SIGHUP, reload_signal); #else signal(SIGHUP, SIG_IGN); -#endif /* CONFIG_FEATURE_USE_INITTAB */ +#endif /* FEATURE_USE_INITTAB */ /* Now run the looping stuff for the rest of forever */ diff --git a/libbb/error_msg_and_die.c b/libbb/error_msg_and_die.c index 10d953513..7c5a4ebe9 100644 --- a/libbb/error_msg_and_die.c +++ b/libbb/error_msg_and_die.c @@ -15,6 +15,13 @@ int die_sleep; +void sleep_and_die(void) +{ + if (die_sleep) + sleep(die_sleep); + exit(xfunc_error_retval); +} + void bb_error_msg_and_die(const char *s, ...) { va_list p; @@ -22,7 +29,5 @@ void bb_error_msg_and_die(const char *s, ...) va_start(p, s); bb_verror_msg(s, p, NULL); va_end(p); - if (die_sleep) - sleep(die_sleep); - exit(xfunc_error_retval); + sleep_and_die(); } diff --git a/libbb/fflush_stdout_and_exit.c b/libbb/fflush_stdout_and_exit.c index 456ce9513..6f44770c6 100644 --- a/libbb/fflush_stdout_and_exit.c +++ b/libbb/fflush_stdout_and_exit.c @@ -15,10 +15,7 @@ void fflush_stdout_and_exit(int retval) { - if (fflush(stdout)) { - retval = xfunc_error_retval; - } - if (die_sleep) - sleep(die_sleep); + if (fflush(stdout)) + sleep_and_die(); exit(retval); } diff --git a/libbb/herror_msg_and_die.c b/libbb/herror_msg_and_die.c index f62ddd2ea..a7a22caf7 100644 --- a/libbb/herror_msg_and_die.c +++ b/libbb/herror_msg_and_die.c @@ -19,7 +19,5 @@ void bb_herror_msg_and_die(const char *s, ...) va_start(p, s); bb_vherror_msg(s, p); va_end(p); - if (die_sleep) - sleep(die_sleep); - exit(xfunc_error_retval); + sleep_and_die(); } diff --git a/libbb/perror_msg_and_die.c b/libbb/perror_msg_and_die.c index 2303ba211..7521e7157 100644 --- a/libbb/perror_msg_and_die.c +++ b/libbb/perror_msg_and_die.c @@ -20,7 +20,5 @@ void bb_perror_msg_and_die(const char *s, ...) va_start(p, s); bb_vperror_msg(s, p); va_end(p); - if (die_sleep) - sleep(die_sleep); - exit(xfunc_error_retval); + sleep_and_die(); } diff --git a/miscutils/crond.c b/miscutils/crond.c index fa7964e4e..aace3ee18 100644 --- a/miscutils/crond.c +++ b/miscutils/crond.c @@ -542,7 +542,7 @@ static void SynchronizeFile(const char *fileName) struct stat sbuf; if (fstat(fileno(fi), &sbuf) == 0 && sbuf.st_uid == DaemonUid) { - CronFile *file = calloc(1, sizeof(CronFile)); + CronFile *file = xzalloc(sizeof(CronFile)); CronLine **pline; file->cf_User = strdup(fileName); @@ -586,7 +586,7 @@ static void SynchronizeFile(const char *fileName) FixDayDow(&line); - *pline = calloc(1, sizeof(CronLine)); + *pline = xzalloc(sizeof(CronLine)); **pline = line; /* copy command */ diff --git a/networking/httpd.c b/networking/httpd.c index e50955ddc..ff5c14672 100644 --- a/networking/httpd.c +++ b/networking/httpd.c @@ -499,7 +499,7 @@ static void parse_conf(const char *path, int flag) continue; if (*p0 == 'A' || *p0 == 'D') { /* storing current config IP line */ - pip = calloc(1, sizeof(Htaccess_IP)); + pip = xzalloc(sizeof(Htaccess_IP)); if (pip) { if (scan_ip_mask(c, &(pip->ip), &(pip->mask))) { /* syntax IP{/mask} error detected, protect all */ @@ -570,7 +570,7 @@ static void parse_conf(const char *path, int flag) || ENABLE_FEATURE_HTTPD_CONFIG_WITH_MIME_TYPES \ || ENABLE_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR /* storing current config line */ - cur = calloc(1, sizeof(Htaccess) + strlen(p0)); + cur = xzalloc(sizeof(Htaccess) + strlen(p0)); if (cur) { cf = strcpy(cur->before_colon, p0); c = strchr(cf, ':'); diff --git a/util-linux/fdisk_sgi.c b/util-linux/fdisk_sgi.c index d8acd6bc7..c83ef2420 100644 --- a/util-linux/fdisk_sgi.c +++ b/util-linux/fdisk_sgi.c @@ -869,7 +869,7 @@ sgi_set_xcyl(void) static sgiinfo * fill_sgiinfo(void) { - sgiinfo *info = calloc(1, sizeof(sgiinfo)); + sgiinfo *info = xzalloc(sizeof(sgiinfo)); info->magic = SGI_SSWAP32(SGI_INFO_MAGIC); info->b1 = SGI_SSWAP32(-1);