[systemd-devel] BUG: several bugs in core/main.c (v218)
Tomasz Pawlak
tomazzi at wp.pl
Sat Jan 24 18:37:09 PST 2015
core/main.c:1519
/* Make sure we leave a core dump without panicing the
* kernel. */
if (getpid() == 1) {
install_crash_handler();
r = mount_cgroup_controllers(arg_join_controllers);
if (r < 0)
goto finish;
}
core/main.c:226
static void install_crash_handler(void) {
struct sigaction sa = {
.sa_handler = crash,
.sa_flags = SA_NODEFER,
};
sigaction_many(&sa, SIGNALS_CRASH_HANDLER, -1);
}
/shared/util.c:2207
int sigaction_many(const struct sigaction *sa, ...) {
va_list ap;
int r = 0, sig;
va_start(ap, sa);
while ((sig = va_arg(ap, int)) > 0)
if (sigaction(sig, sa, NULL) < 0)
r = -errno;
va_end(ap);
return r;
}
shared/def.h:40
#define SIGNALS_CRASH_HANDLER SIGSEGV,SIGILL,SIGFPE,SIGBUS,SIGQUIT,SIGABRT
BUGS:
1. Ignoring return value from sigaction_many(): all sig handlers can silently fail to install, thus leaving the whole process unprotected
2. SIGSEGV should be catched by a handler running on a separate stack (SA_ONSTACK) - otherwise it can cause segfault itself, when the first SIGSEGV which triggered the handler is caused by stack overflow.
3. SA_NODEFER makes no sense, since the handler is expected to catch only first critical signal. With SA_NODEFER nesting of signals is possible, what can cause unpredictable results, including uncatched stack overflow caused by the handler itself.
Regards.
More information about the systemd-devel
mailing list