cpukit/score: avoid NULL and races in priority mutex

The PIP modifications from #3359 introduced new data structures
to track priority inheritance. Prioritized mutexes without PIP
share some of the code paths, and may result in NULL pointer
accesses. This patch checks for NULL, and also adds ISR critical
sections to an uncovered corner case during thread restarts.

Closes #3829.
This commit is contained in:
Gedare Bloom
2020-01-02 15:45:30 -07:00
parent e816b4e961
commit e3f6d35f65
2 changed files with 9 additions and 1 deletions

View File

@@ -109,7 +109,9 @@ bool _Thread_queue_Extract_priority_helper(
}
mutex = _Thread_Dequeue_priority_node( &the_thread->Priority_node );
_Thread_Evaluate_priority( mutex->holder );
if ( mutex != NULL ) {
_Thread_Evaluate_priority( mutex->holder );
}
if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
_ISR_Enable( level );

View File

@@ -48,6 +48,7 @@ void _Thread_Reset(
)
{
CORE_mutex_Control *mutex;
ISR_Level level;
the_thread->resource_count = 0;
#if defined(RTEMS_ITRON_API)
@@ -66,18 +67,23 @@ void _Thread_Reset(
(void) _Watchdog_Remove( &the_thread->Timer );
}
_ISR_Disable( level );
if ( the_thread->Priority_node.waiting_to_hold != NULL ) {
mutex = _Thread_Dequeue_priority_node( &the_thread->Priority_node );
_Thread_Evaluate_priority( mutex->holder );
}
_ISR_Enable( level );
_ISR_Disable( level );
while ( !_Chain_Is_empty( &the_thread->Priority_node.Inherited_priorities ) ) {
_Thread_Dequeue_priority_node(
((Thread_Priority_node*)_Chain_First(
&the_thread->Priority_node.Inherited_priorities
))
);
_ISR_Flash( level );
}
_ISR_Enable( level );
if ( the_thread->Priority_node.current_priority != the_thread->Start.initial_priority ) {
the_thread->Priority_node.real_priority = the_thread->Start.initial_priority;