summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-08-27 14:25:25 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-08-28 14:58:49 +0200
commit7bff82f34f4c36bec8e08830f7c494441f3704c6 (patch)
treeb325a4665ccfeda23d921e61ce079b282afdddad
parentposix: Add and use _POSIX_signals_Acquire() (diff)
downloadrtems-7bff82f34f4c36bec8e08830f7c494441f3704c6.tar.bz2
posix: Avoid NULL pointer access
-rw-r--r--cpukit/posix/src/keyfreememory.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/cpukit/posix/src/keyfreememory.c b/cpukit/posix/src/keyfreememory.c
index 8c249486bb..ff8fc82f6f 100644
--- a/cpukit/posix/src/keyfreememory.c
+++ b/cpukit/posix/src/keyfreememory.c
@@ -29,8 +29,10 @@ void _POSIX_Keys_Free_memory(
POSIX_Keys_Key_value_pair search_node;
POSIX_Keys_Key_value_pair *p;
RBTree_Node *iter, *next;
+ Objects_Id key_id;
- search_node.key = the_key->Object.id;
+ key_id = the_key->Object.id;
+ search_node.key = key_id;
search_node.thread_id = 0;
iter = _RBTree_Find_unprotected( &_POSIX_Keys_Key_value_lookup_tree, &search_node.Key_value_lookup_node );
if ( !iter )
@@ -40,7 +42,7 @@ void _POSIX_Keys_Free_memory(
*/
next = _RBTree_Next_unprotected( iter, RBT_LEFT );
p = _RBTree_Container_of( next, POSIX_Keys_Key_value_pair, Key_value_lookup_node );
- while ( p->key == the_key->Object.id) {
+ while ( next != NULL && p->key == key_id) {
iter = next;
next = _RBTree_Next_unprotected( iter, RBT_LEFT );
p = _RBTree_Container_of( next, POSIX_Keys_Key_value_pair, Key_value_lookup_node );
@@ -50,7 +52,7 @@ void _POSIX_Keys_Free_memory(
* delete all nodes belongs to the_key from the rbtree and chain.
*/
p = _RBTree_Container_of( iter, POSIX_Keys_Key_value_pair, Key_value_lookup_node );
- while ( p->key == the_key->Object.id ) {
+ while ( iter != NULL && p->key == key_id ) {
next = _RBTree_Next_unprotected( iter, RBT_RIGHT );
_RBTree_Extract_unprotected( &_POSIX_Keys_Key_value_lookup_tree, iter );
_Chain_Extract_unprotected( &p->Key_values_per_thread_node );