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:
Peter A. Bigot 2018-12-30 06:38:53 -06:00 committed by Carles Cufí
commit 4863aa809c

View file

@ -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 */