From 0c09d5507ade834054d78beb5290b7dabc47ea2f Mon Sep 17 00:00:00 2001 From: DipSwitch Date: Wed, 31 May 2017 14:18:01 +0200 Subject: [PATCH] sys/xtimer: Fix possible race condition explained in #7114 --- sys/xtimer/xtimer_core.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/sys/xtimer/xtimer_core.c b/sys/xtimer/xtimer_core.c index 1ac645838e9c..22f9c7c3d186 100644 --- a/sys/xtimer/xtimer_core.c +++ b/sys/xtimer/xtimer_core.c @@ -170,6 +170,11 @@ static inline void _lltimer_set(uint32_t target) int _xtimer_set_absolute(xtimer_t *timer, uint32_t target) { + unsigned state = irq_disable(); + if (_is_set(timer)) { + _remove(timer); + } + uint32_t now = _xtimer_now(); int res = 0; @@ -178,16 +183,12 @@ int _xtimer_set_absolute(xtimer_t *timer, uint32_t target) timer->next = NULL; if ((target >= now) && ((target - XTIMER_BACKOFF) < now)) { /* backoff */ + irq_restore(state); xtimer_spin_until(target + XTIMER_BACKOFF); _shoot(timer); return 0; } - unsigned state = irq_disable(); - if (_is_set(timer)) { - _remove(timer); - } - timer->target = target; timer->long_target = _long_cnt; if (target < now) {