score: Fix initialization of thread queue context

Set Thread_queue_Context::timeout_absolute in
_Thread_queue_Context_set_timeout_argument() to avoid using it uninitialized.

The bug was introduced by a89ecaa1a9.
This commit is contained in:
Sebastian Huber
2021-06-10 07:44:45 +02:00
parent f83676d91f
commit 6641cc87b8
6 changed files with 15 additions and 9 deletions

View File

@@ -201,18 +201,24 @@ _Thread_queue_Context_set_timeout_ticks(
/** /**
* @brief Sets the timeout argument in the thread queue context. * @brief Sets the timeout argument in the thread queue context.
* *
* @param[out] queue_context The thread queue context. * @param[out] queue_context is the thread queue context.
* @param arg The timeout argument. *
* @param arg is the timeout argument.
*
* @param absolute is true, if the timeout shall be absolute, otherwise it
* shall be relative to the current time of the clock.
* *
* @see _Thread_queue_Enqueue(). * @see _Thread_queue_Enqueue().
*/ */
RTEMS_INLINE_ROUTINE void RTEMS_INLINE_ROUTINE void
_Thread_queue_Context_set_timeout_argument( _Thread_queue_Context_set_timeout_argument(
Thread_queue_Context *queue_context, Thread_queue_Context *queue_context,
const void *arg const void *arg,
bool absolute
) )
{ {
queue_context->Timeout.arg = arg; queue_context->Timeout.arg = arg;
queue_context->timeout_absolute = absolute;
} }
/** /**

View File

@@ -109,7 +109,7 @@ int _POSIX_Condition_variables_Wait_support(
_Thread_queue_Context_initialize( &queue_context ); _Thread_queue_Context_initialize( &queue_context );
if ( abstime != NULL ) { if ( abstime != NULL ) {
_Thread_queue_Context_set_timeout_argument( &queue_context, abstime ); _Thread_queue_Context_set_timeout_argument( &queue_context, abstime, true );
if ( _POSIX_Condition_variables_Get_clock( flags ) == CLOCK_MONOTONIC ) { if ( _POSIX_Condition_variables_Get_clock( flags ) == CLOCK_MONOTONIC ) {
_Thread_queue_Context_set_enqueue_callout( _Thread_queue_Context_set_enqueue_callout(

View File

@@ -69,7 +69,7 @@ ssize_t _POSIX_Message_queue_Receive_support(
} }
_Thread_queue_Context_set_enqueue_callout( &queue_context, enqueue_callout ); _Thread_queue_Context_set_enqueue_callout( &queue_context, enqueue_callout );
_Thread_queue_Context_set_timeout_argument( &queue_context, abstime ); _Thread_queue_Context_set_timeout_argument( &queue_context, abstime, true );
/* /*
* Now if something goes wrong, we return a "length" of -1 * Now if something goes wrong, we return a "length" of -1

View File

@@ -70,7 +70,7 @@ int _POSIX_Message_queue_Send_support(
} }
_Thread_queue_Context_set_enqueue_callout( &queue_context, enqueue_callout ); _Thread_queue_Context_set_enqueue_callout( &queue_context, enqueue_callout );
_Thread_queue_Context_set_timeout_argument( &queue_context, abstime ); _Thread_queue_Context_set_timeout_argument( &queue_context, abstime, true );
_CORE_message_queue_Acquire_critical( _CORE_message_queue_Acquire_critical(
&the_mq->Message_queue, &the_mq->Message_queue,

View File

@@ -69,7 +69,7 @@ int _POSIX_Mutex_Lock_support(
executing = _POSIX_Mutex_Acquire( the_mutex, &queue_context ); executing = _POSIX_Mutex_Acquire( the_mutex, &queue_context );
_Thread_queue_Context_set_enqueue_callout( &queue_context, enqueue_callout); _Thread_queue_Context_set_enqueue_callout( &queue_context, enqueue_callout);
_Thread_queue_Context_set_timeout_argument( &queue_context, abstime ); _Thread_queue_Context_set_timeout_argument( &queue_context, abstime, true );
switch ( _POSIX_Mutex_Get_protocol( flags ) ) { switch ( _POSIX_Mutex_Get_protocol( flags ) ) {
case POSIX_MUTEX_PRIORITY_CEILING: case POSIX_MUTEX_PRIORITY_CEILING:

View File

@@ -188,7 +188,7 @@ int _Condition_Wait_timed(
&context.Base, &context.Base,
_Condition_Enqueue_with_timeout _Condition_Enqueue_with_timeout
); );
_Thread_queue_Context_set_timeout_argument( &context.Base, abstime ); _Thread_queue_Context_set_timeout_argument( &context.Base, abstime, true );
executing = _Condition_Do_wait( _condition, _mutex, &context ); executing = _Condition_Do_wait( _condition, _mutex, &context );
eno = STATUS_GET_POSIX( _Thread_Wait_get_status( executing ) ); eno = STATUS_GET_POSIX( _Thread_Wait_get_status( executing ) );
_Mutex_Acquire( _mutex ); _Mutex_Acquire( _mutex );
@@ -243,7 +243,7 @@ int _Condition_Wait_recursive_timed(
&context.Base, &context.Base,
_Condition_Enqueue_with_timeout _Condition_Enqueue_with_timeout
); );
_Thread_queue_Context_set_timeout_argument( &context.Base, abstime ); _Thread_queue_Context_set_timeout_argument( &context.Base, abstime, true );
nest_level = _Condition_Unnest_mutex( _mutex ); nest_level = _Condition_Unnest_mutex( _mutex );
executing = _Condition_Do_wait( _condition, &_mutex->_Mutex, &context ); executing = _Condition_Do_wait( _condition, &_mutex->_Mutex, &context );
eno = STATUS_GET_POSIX( _Thread_Wait_get_status( executing ) ); eno = STATUS_GET_POSIX( _Thread_Wait_get_status( executing ) );