Skip to content

Commit

Permalink
dtls.c, netq.c: consider 32bit time overflow.
Browse files Browse the repository at this point in the history
Fixes issue: eclipse#125

Signed-off-by: Achim Kraus <[email protected]>
  • Loading branch information
Achim Kraus committed Mar 29, 2022
1 parent fbf2bd8 commit 2ec3051
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 2 deletions.
3 changes: 2 additions & 1 deletion dtls.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
7 changes: 7 additions & 0 deletions dtls_time.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
#endif

typedef uint64_t clock_time_t;

#else /* WITH_CONTIKI || RIOT_VERSION */

#ifdef HAVE_TIME_H
Expand All @@ -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;
Expand All @@ -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:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1AB9U8lJL6yAngGVG6AMKpaAVxYMJG0g4AyeBkwAOXcAI0xiEAA2UgAHVAVCWwZnNw8vOISkgX9AkJZwyJjLTGtkoQImYgJU908ubxKygQqqglzgsIjoi0rq2vSG3raO/MLogEoLVFdiZHYOAFIAJgBmAOQ3LABqRdXHBQJ8VAA6BD3sRY0AQRX1hk3XHb2Do4CCM4ur25u7rBpAtsACpBYwAeQAYhChNggdsIABWDQTb7fAgAT1imH%2B21c7wAHMYCNtNqhkABrIl4NhEvYAIVRN3e2xYTACEAAbqg8OgUQB2Bk3bbC7Zcgw2egk2hkyk2GnE4l7AAi2w09O%2BItFLiYEswUplVPl2wYu1WKrVq0F101aAYh31FMNmCJLKYwDwyGMqCoVCUirN8KgpMdcudBAmAD9kabLqtsNsuCjLRqRYsBSnhczkKbzeqhSL%2BMR4cy8DnVaa6dtSy9tqsNBbK9Xlgzm9t%2BVbNZqAPRd0sAdzotG2qA5ESo0r7VcEqG2xMM6GNu3zndnZbweetK8Xyqr2wAtMDQZDobCN1uq1RA8HZdSwxMIKz3Z7vb7MIrWyaD%2BHTY5XU%2BvT6frthm54kisLYMsmy6dmmSogbBIGxMQ7xUBAKzLNKqCxAmJIgCsCILosCKOAw6GkCSSYdqmfJwb80FplRmaCCSZYNiBhbFsx1YBhoFa7jWdYNvxzbgW2DEgd2vbbAOtBDiOY4TlORCrvO27QZq/oquuUGbiuJo7qWB4guCUIwkCZ5bngl5BtKIa3kS96frOEw/qqwHqVuyDgd5Onngh9E0YhyGCKh6GYdhyy4fhhHEaRyzLORyCUfBgV0bpuzptBWasRZwocRAJasXx3G/oJ9LCRBYmZelkn9oOw6jsQ46oJO7wznODALvpHnCppVa5Z2%2BkBoZh4mSe5m%2BZZ1kQE5341si4k9Z2XkiSJk0rv56WbZqSEoWh8XhbWUXLARuyxWRFEDZtQV7eh0VESRF2Ph6AGvuGV3QcQb6zCabG/DRHBTLQnAIrwngcFopCoJwv4KDMcx6ncPCkAQmiA1M5IgKsqwnNjeP4wTMTAxwkhg2jUOcLwCggN4qMQ4DpBwLASBoCwsR0BE5CUKz7P0JEyDAFwXAJTQtAEBE1MQKE5OhAEVTouTrNsIIYIMLQCv06QWCskY4ia/gX1lKO1Oa5gqilK44vk%2B8mDE5DtB4KExDy84WCcMjBDISw7sM%2BOboKAAangmB9mCWLg8j/CCCIYjsFIMiCIoKjqJruhcPohgmGY%2BiO9TkBTFhNgCCb%2B5gqsVO26UReeBADgDPUPidaMXSROn8SJNX9d6O32QMM3BTdOnTTV60/QuHUejD%2BUfTtAEnQD63wxj2kDeHCMc9jIPUxw7M8x6J7mALDwQMg2TmvQxwqj4lEe5RJI2zAMg2ZCyckUQI45G4IQJC7Gs6fbM4NmHMixIwmLwOmWgJgYyxhoV%2BXA%2BTY0kKsfEGg%2BTLD5AATlWNIYmpNSDg0hhfKmNMUZoymEzKAMBEAgCIC4LmEAqjABNrwRhChlCGFtkIBALUfakB5sAvQ2Jv6LyjsIUQ4h46iKTmocmLABBMDQF/IgxAAASTAFB0kPgwa4ltUBh0YNiXhcjmCKPwMo/REdeDGIUagCo%2BBLG9HsZTRxAR2GBFoFwlqDjaG0AAJLoBALEJg3D6CkD7M7WIPsT4cFBvg8mF8gkhMRn/aShAEDbCvjfO%2BD8n4Ji4K/cBZDoHY1xgTMp2N9CcDwd7JEcTz7OOprTMhjMqEQCQDMAgsRLb0P4XzQRZiSB6FETHCR0gpFKBkZrcJTBIncAZsTWJBDeAXzBJbLpxJvQZOvrfe%2Bj9n75LfoA3mERf6rETIU%2BmUDSAIEwEwLAkQIDROqSAWpSyKYcGIU0y5xSognEkJILBqx4r4gRFg/ECDKkcHLnUwhziIHo0hcsM%2BsKPmkO%2BaQRqiQ7CSCAA%3D
#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) ((DTLS_OFFSET_TIME + (B)-(A)) >= DTLS_OFFSET_TIME)

/** @} */

#endif /* _DTLS_DTLS_TIME_H_ */
3 changes: 2 additions & 1 deletion netq.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 2ec3051

Please sign in to comment.