kernel: poll: fix double-remove of node
k_poll events are registered in a linked list when their signal condition has been met. The code to clear event registration did not account for events that were not registered, resulting in double-removes that produced core dumps on native-posix sanitycheck. Signed-off-by: Peter A. Bigot <pab@pabigot.com>
This commit is contained in:
parent
25fbe7b60d
commit
4863aa809c
1 changed files with 8 additions and 3 deletions
|
@ -133,20 +133,22 @@ static inline int register_event(struct k_poll_event *event,
|
|||
/* must be called with interrupts locked */
|
||||
static inline void clear_event_registration(struct k_poll_event *event)
|
||||
{
|
||||
bool remove = false;
|
||||
|
||||
event->poller = NULL;
|
||||
|
||||
switch (event->type) {
|
||||
case K_POLL_TYPE_SEM_AVAILABLE:
|
||||
__ASSERT(event->sem != NULL, "invalid semaphore\n");
|
||||
sys_dlist_remove(&event->_node);
|
||||
remove = true;
|
||||
break;
|
||||
case K_POLL_TYPE_DATA_AVAILABLE:
|
||||
__ASSERT(event->queue != NULL, "invalid queue\n");
|
||||
sys_dlist_remove(&event->_node);
|
||||
remove = true;
|
||||
break;
|
||||
case K_POLL_TYPE_SIGNAL:
|
||||
__ASSERT(event->signal != NULL, "invalid poll signal\n");
|
||||
sys_dlist_remove(&event->_node);
|
||||
remove = true;
|
||||
break;
|
||||
case K_POLL_TYPE_IGNORE:
|
||||
/* nothing to do */
|
||||
|
@ -155,6 +157,9 @@ static inline void clear_event_registration(struct k_poll_event *event)
|
|||
__ASSERT(false, "invalid event type\n");
|
||||
break;
|
||||
}
|
||||
if (remove && sys_dnode_is_linked(&event->_node)) {
|
||||
sys_dlist_remove(&event->_node);
|
||||
}
|
||||
}
|
||||
|
||||
/* must be called with interrupts locked */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue