mirror of
https://github.com/troglobit/finit.git
synced 2026-10-31 13:00:32 +00:00
Fix segfault on X86_64, call va_end()+va_start() for each vfprintf()
... varargs is a special kind of hell. Signed-off-by: Joachim Nilsson <troglobit@gmail.com>
This commit is contained in:
1 parent
8992e7bf2b
commit
f7c0366fa2
1 file changed
+25
-27
@@ -105,45 +105,43 @@ int log_is_debug(void)
|
|||||||
return debug;
|
return debug;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void early_logit(int prio, const char *fmt, va_list ap)
|
|
||||||
{
|
|
||||||
FILE *fp;
|
|
||||||
|
|
||||||
if (!debug && prio > loglevel)
|
|
||||||
return;
|
|
||||||
|
|
||||||
fp = fopen("/dev/kmsg", "w");
|
|
||||||
if (fp) {
|
|
||||||
fprintf(fp, "<%d>finit[1]:", LOG_DAEMON | prio);
|
|
||||||
vfprintf(fp, fmt, ap);
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
if (debug)
|
|
||||||
vfprintf(stderr, fmt, ap);
|
|
||||||
} else {
|
|
||||||
vfprintf(stderr, fmt, ap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Log to /dev/kmsg until syslogd has started, then openlog()
|
* Log to /dev/kmsg until syslogd has started, then openlog()
|
||||||
* and continue logging as a regular daemon.
|
* and continue logging as a regular daemon.
|
||||||
*/
|
*/
|
||||||
void logit(int prio, const char *fmt, ...)
|
void logit(int prio, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
|
FILE *fp;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
if (!up) {
|
|
||||||
if (!fexist("/dev/log")) {
|
|
||||||
early_logit(prio, fmt, ap);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
log_open();
|
if (up || fexist("/dev/log")) {
|
||||||
|
if (!up)
|
||||||
|
log_open();
|
||||||
|
vsyslog(prio, fmt, ap);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!debug && prio > loglevel)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
fp = fopen("/dev/kmsg", "w");
|
||||||
|
if (!fp) {
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(fp, "<%d>finit[1]:", LOG_DAEMON | prio);
|
||||||
|
vfprintf(fp, fmt, ap);
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
if (debug) {
|
||||||
|
va_end(ap);
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
vsyslog(prio, fmt, ap);
|
|
||||||
done:
|
done:
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user