aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstddjb
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2025-05-16 14:48:51 +0000
committerLaurent Bercot <ska@appnovation.com>2025-05-16 14:48:51 +0000
commitf40d8d198eea1d91f092c09ee738f751ada741bc (patch)
tree19f6fa9f73a0b4fe8c11263ea97b36c362eecc3b /src/libstddjb
parent1be7c0764d4ae35e38032a4fd4afb19b3c9a88ee (diff)
downloadskalibs-f40d8d198eea1d91f092c09ee738f751ada741bc.tar.gz
bugfix: alarm_timeout with infinite value
Signed-off-by: Laurent Bercot <ska@appnovation.com>
Diffstat (limited to 'src/libstddjb')
-rw-r--r--src/libstddjb/alarm_deadline.c7
-rw-r--r--src/libstddjb/alarm_timeout.c16
2 files changed, 19 insertions, 4 deletions
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 <errno.h>
+#include <limits.h>
#include <signal.h>
#include <time.h>
#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 <errno.h>
+#include <limits.h>
#include <signal.h>
#include <time.h>
#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 <limits.h>
#include <sys/time.h>
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 ;