Fix race condition in utmp writing. Patch from Gil Kloepfer via

Mike Frysinger and Gentoo.
This commit is contained in:
Petter Reinholdtsen 2009-11-22 21:03:03 +00:00
parent b80d3844c1
commit de91f43eb8
2 changed files with 22 additions and 9 deletions

View File

@ -17,6 +17,8 @@ sysvinit (2.88dsf) UNRELEASED; urgency=low
Patch from Mike Frysinger and Gentoo. Patch from Mike Frysinger and Gentoo.
* Sync shutdown manual page and usage information. Patch from Mike * Sync shutdown manual page and usage information. Patch from Mike
Frysinger and Gentoo. Frysinger and Gentoo.
* Fix race condition in utmp writing. Patch from Gil Kloepfer via
Mike Frysinger and Gentoo.
-- Petter Reinholdtsen <pere@hungry.com> Sun, 12 Jul 2009 19:58:10 +0200 -- Petter Reinholdtsen <pere@hungry.com> Sun, 12 Jul 2009 19:58:10 +0200

View File

@ -967,6 +967,25 @@ int spawn(CHILD *ch, int *res)
sigprocmask(SIG_SETMASK, &omask, NULL); sigprocmask(SIG_SETMASK, &omask, NULL);
/*
* Update utmp/wtmp file prior to starting
* any child. This MUST be done right here in
* the child process in order to prevent a race
* condition that occurs when the child
* process' time slice executes before the
* parent (can and does happen in a uniprocessor
* environment). If the child is a getty and
* the race condition happens, then init's utmp
* update will happen AFTER the getty runs
* and expects utmp to be updated already!
*
* Do NOT log if process field starts with '+'
* FIXME: that's for compatibility with *very*
* old getties - probably it can be taken out.
*/
if (ch->action == RESPAWN && ch->process[0] != '+')
write_utmp_wtmp("", ch->id, getpid(), INIT_PROCESS, "");
/* /*
* In sysinit, boot, bootwait or single user mode: * In sysinit, boot, bootwait or single user mode:
* for any wait-type subprocess we _force_ the console * for any wait-type subprocess we _force_ the console
@ -1109,15 +1128,7 @@ void startup(CHILD *ch)
case ONDEMAND: case ONDEMAND:
case RESPAWN: case RESPAWN:
ch->flags |= RUNNING; ch->flags |= RUNNING;
if (spawn(ch, &(ch->pid)) < 0) break; (void)spawn(ch, &(ch->pid));
/*
* Do NOT log if process field starts with '+'
* FIXME: that's for compatibility with *very*
* old getties - probably it can be taken out.
*/
if (ch->process[0] != '+')
write_utmp_wtmp("", ch->id, ch->pid,
INIT_PROCESS, "");
break; break;
} }
} }