summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2009-05-28 20:38:22 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2009-05-28 20:38:22 +0000
commitee2e3a1038660d634fb9cc9c30d96adf184389bc (patch)
tree4af0249efba6ea683cf4c7ad8a5f44e3e6d2164f /cpukit/rtems
parent2009-05-21 Joel Sherrill <joel.sherrill@OARcorp.com> (diff)
downloadrtems-ee2e3a1038660d634fb9cc9c30d96adf184389bc.tar.bz2
2009-05-28 Joel Sherrill <joel.sherrill@OARcorp.com>
PR 1415/cpukit * rtems/src/semcreate.c, rtems/src/semtranslatereturncode.c, score/include/rtems/score/coremutex.h, score/inline/rtems/score/coremutex.inl, score/src/coremutex.c: Address two paths where a task with a priority above the ceiling could obtain a priority ceiling mutex.
Diffstat (limited to 'cpukit/rtems')
-rw-r--r--cpukit/rtems/src/semcreate.c20
-rw-r--r--cpukit/rtems/src/semtranslatereturncode.c5
2 files changed, 13 insertions, 12 deletions
diff --git a/cpukit/rtems/src/semcreate.c b/cpukit/rtems/src/semcreate.c
index d7827c116c..9950aecb4a 100644
--- a/cpukit/rtems/src/semcreate.c
+++ b/cpukit/rtems/src/semcreate.c
@@ -80,7 +80,6 @@ rtems_status_code rtems_semaphore_create(
register Semaphore_Control *the_semaphore;
CORE_mutex_Attributes the_mutex_attributes;
CORE_semaphore_Attributes the_semaphore_attributes;
- uint32_t lock;
if ( !rtems_is_name_valid( name ) )
return RTEMS_INVALID_NAME;
@@ -146,6 +145,8 @@ rtems_status_code rtems_semaphore_create(
*/
if ( !_Attributes_Is_counting_semaphore( attribute_set ) ) {
+ CORE_mutex_Status mutex_status;
+
if ( _Attributes_Is_inherit_priority( attribute_set ) )
the_mutex_attributes.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
else if ( _Attributes_Is_priority_ceiling( attribute_set ) )
@@ -176,16 +177,17 @@ rtems_status_code rtems_semaphore_create(
the_mutex_attributes.priority_ceiling = priority_ceiling;
- if ( count == 1 )
- lock = CORE_MUTEX_UNLOCKED;
- else
- lock = CORE_MUTEX_LOCKED;
-
- _CORE_mutex_Initialize(
+ mutex_status = _CORE_mutex_Initialize(
&the_semaphore->Core_control.mutex,
&the_mutex_attributes,
- lock
- );
+ (count == 1) ? CORE_MUTEX_UNLOCKED : CORE_MUTEX_LOCKED
+ );
+
+ if ( mutex_status == CORE_MUTEX_STATUS_CEILING_VIOLATED ) {
+ _Semaphore_Free( the_semaphore );
+ _Thread_Enable_dispatch();
+ return RTEMS_INVALID_PRIORITY;
+ }
} else {
if ( _Attributes_Is_priority( attribute_set ) )
the_semaphore_attributes.discipline = CORE_SEMAPHORE_DISCIPLINES_PRIORITY;
diff --git a/cpukit/rtems/src/semtranslatereturncode.c b/cpukit/rtems/src/semtranslatereturncode.c
index 261aaa57de..b22cf0ff44 100644
--- a/cpukit/rtems/src/semtranslatereturncode.c
+++ b/cpukit/rtems/src/semtranslatereturncode.c
@@ -15,7 +15,7 @@
* + acquire a semaphore
* + release a semaphore
*
- * COPYRIGHT (c) 1989-2007.
+ * COPYRIGHT (c) 1989-2009.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -71,10 +71,9 @@ const rtems_status_code _Semaphore_Translate_core_mutex_return_code_[] = {
#ifdef __RTEMS_STRICT_ORDER_MUTEX__
CORE_MUTEX_RELEASE_NOT_ORDER,
#endif
- RTEMS_INTERNAL_ERROR /* CORE_MUTEX_STATUS_CEILING_VIOLATED */
+ RTEMS_INVALID_PRIORITY /* CORE_MUTEX_STATUS_CEILING_VIOLATED */
};
-
rtems_status_code _Semaphore_Translate_core_mutex_return_code (
uint32_t status
)