Fix race condition in utmp writing. Patch from Gil Kloepfer via
Mike Frysinger and Gentoo.
This commit is contained in:
parent
b80d3844c1
commit
de91f43eb8
@ -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
|
||||||
|
|
||||||
|
29
src/init.c
29
src/init.c
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user