From cde751a7ec11429464d900d013483f38a8ce2f99 Mon Sep 17 00:00:00 2001 From: Achim Kraus Date: Tue, 29 Mar 2022 17:40:06 +0200 Subject: [PATCH] dtls.c, netq.c: consider 32bit time overflow. Fixes issue: #125 Signed-off-by: Achim Kraus --- dtls.c | 3 ++- dtls_time.h | 7 +++++++ netq.c | 3 ++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/dtls.c b/dtls.c index 97ad5b0e..a558790e 100644 --- a/dtls.c +++ b/dtls.c @@ -4702,7 +4702,8 @@ dtls_check_retransmit(dtls_context_t *context, clock_time_t *next) { netq_t *node = netq_head(&context->sendqueue); dtls_ticks(&now); - while (node && node->t <= now) { + /* comparison considering 32bit overflow */ + while (node && DTLS_IS_BEFORE_TIME(node->t, now)) { netq_pop_first(&context->sendqueue); dtls_retransmit(context, node); node = netq_head(&context->sendqueue); diff --git a/dtls_time.h b/dtls_time.h index f9974327..1aafa9a1 100644 --- a/dtls_time.h +++ b/dtls_time.h @@ -51,6 +51,7 @@ #endif typedef uint64_t clock_time_t; + #else /* WITH_CONTIKI || RIOT_VERSION */ #ifdef HAVE_TIME_H @@ -62,6 +63,7 @@ typedef uint64_t clock_time_t; #endif typedef uint32_t clock_time_t; + #endif /* WITH_CONTIKI || RIOT_VERSION */ typedef clock_time_t dtls_tick_t; @@ -73,6 +75,11 @@ typedef clock_time_t dtls_tick_t; void dtls_clock_init(void); void dtls_ticks(dtls_tick_t *t); +/* see https://godbolt.org/z/YchexKaeT */ +#define DTLS_OFFSET_TIME (((clock_time_t)~0) >> 1) +/** Checks if A is before (or equal) B. Considers 32 bit time overflow */ +#define DTLS_IS_BEFORE_TIME(A, B) ((clock_time_t)(DTLS_OFFSET_TIME + (B)-(A)) >= DTLS_OFFSET_TIME) + /** @} */ #endif /* _DTLS_DTLS_TIME_H_ */ diff --git a/netq.c b/netq.c index 06754f7a..20619543 100644 --- a/netq.c +++ b/netq.c @@ -93,7 +93,8 @@ netq_insert_node(netq_t **queue, netq_t *node) { assert(node); p = *queue; - while(p && p->t <= node->t) { + /* comparison considering 32bit overflow */ + while(p && DTLS_IS_BEFORE_TIME(p->t, node->t)) { assert(p != node); if (p == node) return 0;