Skip to content

Commit fd50016

Browse files
jerome-pouillercfriedt
authored andcommitted
portability: cmsis: Fix possible race in osEventFlagsWait()
In osEventFlagsWait(), if an event raises after the call to k_event_wait() and before the call to k_event_clear(), we may clear it while it is not going to be report to the caller. Reported-by: Rahul Gurram <[email protected]> Signed-off-by: Jérôme Pouiller <[email protected]>
1 parent 720897d commit fd50016

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

subsys/portability/cmsis_rtos_v2/event_flags.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ uint32_t osEventFlagsWait(osEventFlagsId_t ef_id, uint32_t flags, uint32_t optio
9191
uint32_t timeout)
9292
{
9393
struct cmsis_rtos_event_cb *events = (struct cmsis_rtos_event_cb *)ef_id;
94+
uint32_t sub_opt = options & (osFlagsWaitAll | osFlagsNoClear);
9495
uint32_t rv;
9596
k_timeout_t event_timeout;
9697

@@ -114,14 +115,21 @@ uint32_t osEventFlagsWait(osEventFlagsId_t ef_id, uint32_t flags, uint32_t optio
114115
event_timeout = K_TICKS(timeout);
115116
}
116117

117-
if ((options & osFlagsWaitAll) != 0) {
118+
switch (sub_opt) {
119+
case osFlagsWaitAll | osFlagsNoClear:
118120
rv = k_event_wait_all(&events->z_event, flags, false, event_timeout);
119-
} else {
121+
break;
122+
case osFlagsWaitAll:
123+
rv = k_event_wait_all_safe(&events->z_event, flags, false, event_timeout);
124+
break;
125+
case osFlagsNoClear:
120126
rv = k_event_wait(&events->z_event, flags, false, event_timeout);
121-
}
122-
123-
if ((options & osFlagsNoClear) == 0) {
124-
k_event_clear(&events->z_event, flags);
127+
break;
128+
case 0:
129+
rv = k_event_wait_safe(&events->z_event, flags, false, event_timeout);
130+
break;
131+
default:
132+
__ASSERT_NO_MSG(0);
125133
}
126134

127135
if (rv != 0U) {

0 commit comments

Comments
 (0)