From f40d8d198eea1d91f092c09ee738f751ada741bc Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Fri, 16 May 2025 14:48:51 +0000 Subject: bugfix: alarm_timeout with infinite value Signed-off-by: Laurent Bercot --- src/libstddjb/alarm_deadline.c | 7 ++++++- src/libstddjb/alarm_timeout.c | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/libstddjb/alarm_deadline.c b/src/libstddjb/alarm_deadline.c index 1844c8c..e050eba 100644 --- a/src/libstddjb/alarm_deadline.c +++ b/src/libstddjb/alarm_deadline.c @@ -7,6 +7,7 @@ #ifdef SKALIBS_HASTIMER #include +#include #include #include #include "alarm-internal.h" @@ -22,7 +23,11 @@ int alarm_deadline (tain const *deadline) { struct itimerspec it = { .it_interval = { .tv_sec = 0, .tv_nsec = 0 } } ; struct sigevent se = { .sigev_notify = SIGEV_SIGNAL, .sigev_signo = SIGALRM, .sigev_value = { .sival_int = 0 }, .sigev_notify_function = 0, .sigev_notify_attributes = 0 } ; - if (!timespec_from_tain(&it.it_value, deadline)) return 0 ; + if (!timespec_from_tain(&it.it_value, deadline)) + { + it.it_value.tv_sec = INT_MAX ; + it.it_value.tv_nsec = 0 ; + } if (timer_create(MYCLOCK, &se, &timer_here) < 0) return 0 ; if (timer_settime(timer_here, TIMER_ABSTIME, &it, 0) < 0) { diff --git a/src/libstddjb/alarm_timeout.c b/src/libstddjb/alarm_timeout.c index 1c1b865..8ce5d3d 100644 --- a/src/libstddjb/alarm_timeout.c +++ b/src/libstddjb/alarm_timeout.c @@ -7,6 +7,7 @@ #ifdef SKALIBS_HASTIMER #include +#include #include #include #include "alarm-internal.h" @@ -22,7 +23,11 @@ int alarm_timeout (tain const *tto) { struct itimerspec it = { .it_interval = { .tv_sec = 0, .tv_nsec = 0 } } ; struct sigevent se = { .sigev_notify = SIGEV_SIGNAL, .sigev_signo = SIGALRM, .sigev_value = { .sival_int = 0 }, .sigev_notify_function = 0, .sigev_notify_attributes = 0 } ; - if (!timespec_from_tain_relative(&it.it_value, tto)) return 0 ; + if (!timespec_from_tain_relative(&it.it_value, tto)) + { + it.it_value.tv_sec = INT_MAX ; + it.it_value.tv_nsec = 0 ; + } if (timer_create(MYCLOCK, &se, &timer_here) < 0) return 0 ; if (timer_settime(timer_here, 0, &it, 0) < 0) { @@ -37,12 +42,17 @@ int alarm_timeout (tain const *tto) #else #ifdef SKALIBS_HASITIMER +#include #include int alarm_timeout (tain const *tto) { struct itimerval it = { .it_interval = { .tv_sec = 0, .tv_usec = 0 } } ; - if (!timeval_from_tain_relative(&it.it_value, tto)) return 0 ; + if (!timeval_from_tain_relative(&it.it_value, tto)) + { + it.it_value.tv_sec = INT_MAX ; + it.it_value.tv_usec = 0 ; + } if (setitimer(ITIMER_REAL, &it, 0) < 0) return 0 ; return 1 ; } @@ -55,7 +65,7 @@ int alarm_timeout (tain const *tto) int alarm_timeout (tain const *tto) { int t = tain_to_millisecs(tto) ; - if (t < 0 || t > INT_MAX - 999) return 0 ; + if (t < 0 || t > INT_MAX - 999) t = INT_MAX - 999 ; t = (t + 999) / 1000 ; alarm(t) ; return 1 ; -- cgit v1.3.1