parlib: Fix devalarms on forks without exec
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 28 Sep 2017 14:54:06 +0000 (10:54 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 29 Sep 2017 14:00:03 +0000 (10:00 -0400)
After the fork, the child would close the alarm FDs, which are the
parent's alarm FDs.  However, it wouldn't get its own alarms until exec,
during the ctor.  For processes that forked but never execed, they
wouldn't have the alarm service available.

I noticed this when the process's child was trying to close those -42
FDs when the process forked. (e.g. db -> db -> sh).

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/parlib/alarm.c

index b11accd..bb5a536 100644 (file)
@@ -139,12 +139,10 @@ static void reset_tchain_times(struct timer_chain *tchain)
 
 static void devalarm_forked(void)
 {
-       /* We need to poison the FDs too, in case the child attempts to use the
-        * alarms.  It'd be chaos if they read/wrote to an arbitrary open FD. */
        close(global_tchain.ctlfd);
-       global_tchain.ctlfd = -42;
        close(global_tchain.timerfd);
-       global_tchain.timerfd = -42;
+       if (devalarm_get_fds(&global_tchain.ctlfd, &global_tchain.timerfd, NULL))
+               perror("Useralarm on fork");
 }
 
 static void __attribute__((constructor)) alarm_service_ctor(void)