On Sat, Jan 21, 2012 at 09:39:30AM +0100, Otto Moerbeek wrote: > On Fri, Jan 20, 2012 at 10:48:54AM +0100, Otto Moerbeek wrote: > > > On Fri, Jan 20, 2012 at 10:38:35AM +0100, Michael Meskes wrote: > > > > > On Thu, Jan 19, 2012 at 09:41:08PM +0100, Otto Moerbeek wrote: > > > > > With a hint from Paul Jantzen I did test this a bit further. There's > > > > > > > > That is, Paul Janzen, sorry about that. > > > > > > > > > code to avoid having a child runing too long. If you have 20s > > > > > patience, you'll see this: > > > > > > > > > > calendar: uid 1000 did not finish in time > > > > > > After reading Paul's explanation I found my mistake. The fix works great > > > for > > > calendar -a but not if you call calendar directly on the named pipe. Of > > > course > > > the latter is not really a problem, so I'm going to remove that patch > > > from our > > > sources. > > > > > > Thanks for the explanations. > > > > > > Any ideas about the other patches? > > > > I don't think I have a chance to look at them the coming time. > > Any other volunteer here? > > > > -Otto > > Buete here is Paul's diff. It makes sure all descendants are killed, > insted of only the direct child. > > OK?
Nobody? Unless somebody objects, I'm going to commit this soon. -Otto > > -Otto > > Index: calendar.c > =================================================================== > RCS file: /cvs/src/usr.bin/calendar/calendar.c,v > retrieving revision 1.27 > diff -u calendar.c > --- calendar.c 12 Sep 2011 21:23:00 -0000 1.27 > +++ calendar.c 19 Jan 2012 18:29:22 -0000 > @@ -169,6 +169,7 @@ > warn("fork"); > continue; > case 0: /* child */ > + (void)setpgid(getpid(), getpid()); > (void)setlocale(LC_ALL, ""); > if (setusercontext(NULL, pw, pw->pw_uid, > LOGIN_SETALL ^ LOGIN_SETLOGIN)) > @@ -214,7 +215,10 @@ > /* It doesn't _really_ matter if the kill > fails, e.g. > * if there's only a zombie now. > */ > - (void)kill(kid, SIGTERM); > + if (getpgid(kid) != getpgrp()) > + (void)killpg(getpgid(kid), SIGTERM); > + else > + (void)kill(kid, SIGTERM); > warnx("uid %u did not finish in time", > pw->pw_uid); > } > if (time(NULL) - t >= SECSPERDAY)