From 930a139d7066258787224bb50751c953ac7b048a Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Thu, 9 Jun 2011 19:29:52 +0000 Subject: [PATCH] * LockTarget[WithTimeout()]: Detect potential race condition where the looper is deleted/recreated in between retrieval and lock. Report failure if so. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42073 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/app/Messenger.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/kits/app/Messenger.cpp b/src/kits/app/Messenger.cpp index 3c005642e7..f5e0c20c53 100644 --- a/src/kits/app/Messenger.cpp +++ b/src/kits/app/Messenger.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2007, Haiku. + * Copyright 2001-2011, Haiku. * Distributed under the terms of the MIT License. * * Authors: @@ -212,7 +212,16 @@ BMessenger::LockTarget() const { BLooper *looper = NULL; Target(&looper); - return looper && looper->Lock(); + if (looper && looper->Lock()) { + if (looper->fMsgPort == fPort) + return true; + else { + looper->Unlock(); + return false; + } + } + + return false; } @@ -237,6 +246,9 @@ BMessenger::LockTargetWithTimeout(bigtime_t timeout) const status_t error = looper ? B_OK : B_BAD_VALUE; if (error == B_OK) error = looper->LockWithTimeout(timeout); + + if (error == B_OK && looper->fMsgPort != fPort) + return B_BAD_PORT_ID; return error; }