On 2022-02-04 18:57:27 +0100, Vincent Lefevre wrote:
> 2. Due to the above minor issue, the timer was set at the present
>    time 18:43:00 (1643996580). But for some reason, the pause()
>    that follows it is not interrupted. This is the real issue.
>    This also makes the patched "at" unreliable as this yields a
>    race condition: the timer may still expire before pause() is
>    called, though this is normally rather unlikely, I think.

Well, according to the timer_create(2) man page, that's a sleep()
that should be used, not pause().

New patch attached, which also fixes another issue when
HAVE_CLOCK_GETTIME is not defined: in atd_setalarm(), the value
of the subtraction could be negative (unexpected, but possible),
then implicitly converted to unsigned int for sleep(), which is
obviously incorrect.

-- 
Vincent Lefèvre <vinc...@vinc17.net> - Web: <https://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon)
Index: at-3.2.4/atd.c
===================================================================
--- at-3.2.4.orig/atd.c
+++ at-3.2.4/atd.c
@@ -804,7 +804,7 @@ void atd_setalarm(time_t next)
 {
     timeout.it_value.tv_sec = next;
     timer_settime(timer, TIMER_ABSTIME, &timeout, NULL);
-    pause();
+    sleep(next - now);
 }
 #else
 void timer_setup()
@@ -818,7 +818,7 @@ time_t atd_gettime()
 
 void atd_setalarm(time_t next)
 {
-    sleep(next - atd_gettime());
+    sleep(next - now);
 }
 #endif
 /* Global functions */
@@ -953,7 +953,7 @@ main(int argc, char *argv[])
     daemon_setup();
 
     do {
-	now = time(NULL);
+	now = atd_gettime();
 	next_invocation = run_loop();
 	if ((next_invocation > now) && (!hupped)) {
     	    atd_setalarm(next_invocation);

Reply via email to