From 1655d68ec4ff044de069e986060d6bed2bff8ce1 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Wed, 5 Jan 2022 12:04:02 -0600 Subject: [PATCH] Fix for NaN/overflow timeout in RTEMS-score osdEvent --- modules/libcom/src/osi/os/RTEMS-score/osdEvent.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/modules/libcom/src/osi/os/RTEMS-score/osdEvent.c b/modules/libcom/src/osi/os/RTEMS-score/osdEvent.c index d81538c7f..277e7882f 100644 --- a/modules/libcom/src/osi/os/RTEMS-score/osdEvent.c +++ b/modules/libcom/src/osi/os/RTEMS-score/osdEvent.c @@ -20,6 +20,7 @@ #define __RTEMS_VIOLATE_KERNEL_VISIBILITY__ 1 #include +#include #include #include @@ -132,9 +133,17 @@ epicsEventWaitWithTimeout(epicsEventId id, double timeout) if (timeout <= 0.0) return epicsEventTryWait(id); SEMSTAT(1) - delay = timeout * rtemsTicksPerSecond_double; - if (delay == 0) - delay++; + if (timeout < (double) UINT32_MAX / rtemsTicksPerSecond_double) { + delay = timeout * rtemsTicksPerSecond_double; + if (delay == 0) { + /* 0 < timeout < 1/rtemsTicksPerSecond, round up */ + delay++; + } + } + else { + /* timeout is NaN or too big to represent in ticks */ + delay = RTEMS_NO_TIMEOUT; + } sc = rtems_semaphore_obtain (sid, RTEMS_WAIT, delay); if (sc == RTEMS_SUCCESSFUL) return epicsEventOK;