[PATCH] cpukit/score: avoid NULL and races in priority mutex
Gedare Bloom
gedare at rtems.org
Thu Jan 2 23:26:34 UTC 2020
This patch is for 4.10. A user reported a problem they saw in testing.
I believe this will fix the problem.
On Thu, Jan 2, 2020 at 4:25 PM Gedare Bloom <gedare at rtems.org> wrote:
>
> 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.
> ---
> cpukit/score/src/threadqextractpriority.c | 4 +++-
> cpukit/score/src/threadreset.c | 5 +++++
> 2 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/cpukit/score/src/threadqextractpriority.c b/cpukit/score/src/threadqextractpriority.c
> index 5c8188d661..9288d17980 100644
> --- a/cpukit/score/src/threadqextractpriority.c
> +++ b/cpukit/score/src/threadqextractpriority.c
> @@ -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 );
> diff --git a/cpukit/score/src/threadreset.c b/cpukit/score/src/threadreset.c
> index 464a611391..dfc85c93aa 100644
> --- a/cpukit/score/src/threadreset.c
> +++ b/cpukit/score/src/threadreset.c
> @@ -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,17 +67,21 @@ 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 );
>
> while ( !_Chain_Is_empty( &the_thread->Priority_node.Inherited_priorities ) ) {
> + _ISR_Disable( level );
> _Thread_Dequeue_priority_node(
> ((Thread_Priority_node*)_Chain_First(
> &the_thread->Priority_node.Inherited_priorities
> ))
> );
> + _ISR_Enable( level );
> }
>
> if ( the_thread->Priority_node.current_priority != the_thread->Start.initial_priority ) {
> --
> 2.17.1
>
More information about the devel
mailing list