[PATCH] cpukit/score: avoid NULL and races in priority mutex
Mathew Benson
mbenson at windhoverlabs.com
Thu Jan 2 23:26:57 UTC 2020
This piqued my interest due to an issue we ran into several months ago.
Just so I can better understand this, what is "PIP"? Are you referring to
maybe Priority Inversion Protection?
On Thu, Jan 2, 2020 at 5: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
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
--
*Mathew Benson*
CEO | Chief Engineer
Windhover Labs, LLC
832-640-4018
www.windhoverlabs.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20200102/574ef7ae/attachment.html>
More information about the devel
mailing list