Check for in_sender_list() instead of receiver()

Christian Ehrhardt Christian_Ehrhardt at genua.de
Tue May 3 14:01:34 CEST 2011


Sender::receiver() might return a stale value as the _receiver field
is not cleared. AFAICS the safe way to check for presence in a
sender list is in_sender_list() and not receiver(). Check both in
asserts and use in_sender_list() in Thread::do_kill.


diff --git a/src/kernel/fiasco/src/kern/ipc_sender.cpp b/src/kernel/fiasco/src/kern/ipc_sender.cpp
index bd4f9f8..3290255 100644
--- a/src/kernel/fiasco/src/kern/ipc_sender.cpp
+++ b/src/kernel/fiasco/src/kern/ipc_sender.cpp
@@ -31,7 +31,7 @@ PUBLIC
 virtual void
 Ipc_sender_base::ipc_receiver_aborted()
 {
-  assert (receiver());
+  assert (receiver() && in_sender_list());
 
   sender_dequeue(receiver()->sender_list());
   receiver()->vcpu_update_state();
diff --git a/src/kernel/fiasco/src/kern/thread-ipc.cpp b/src/kernel/fiasco/src/kern/thread-ipc.cpp
index f8e1995..3288b2a 100644
--- a/src/kernel/fiasco/src/kern/thread-ipc.cpp
+++ b/src/kernel/fiasco/src/kern/thread-ipc.cpp
@@ -111,7 +111,7 @@ PUBLIC
 virtual void
 Thread::ipc_receiver_aborted()
 {
-  assert_kdb (receiver());
+  assert_kdb (receiver() && in_sender_list());
 
   sender_dequeue(receiver()->sender_list());
   receiver()->vcpu_update_state();
diff --git a/src/kernel/fiasco/src/kern/thread.cpp b/src/kernel/fiasco/src/kern/thread.cpp
index 08150e8..27f2206 100644
--- a/src/kernel/fiasco/src/kern/thread.cpp
+++ b/src/kernel/fiasco/src/kern/thread.cpp
@@ -561,7 +561,7 @@ Thread::do_kill()
   }
 
   // if engaged in IPC operation, stop it
-  if (receiver())
+  if (in_sender_list())
     sender_dequeue(receiver()->sender_list());
 
   Context::do_kill();




More information about the l4-hackers mailing list