Author: mgoulish
Date: Wed Mar 30 19:11:09 2011
New Revision: 1087047

URL: http://svn.apache.org/viewvc?rev=1087047&view=rev
Log:
qpid-3171

The registration of the codec happens on a different thread from the
use of the codec.  It is possible for the registration to occur after
the first attempted use.  In my testing, this happened 3% of the time
-- 165 times out of 5000 tests -- when using RDMA transport, and 0 times
out of 5000 when using TCP.  Which is why we didn't notice it earlier.

We have a function that tells when we are ready to encode --
CyrusSecurityLayer::canEncode.  But it does not check the validity of
the codec pointer before using it, so it cores in this situation.

I believe simply checking that pointer is probably the best solution.
Introducing that check caused the crash not to show up in 10,000
trials.  There were also no hangs.


Modified:
    qpid/trunk/qpid/cpp/src/qpid/sys/cyrus/CyrusSecurityLayer.cpp

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/cyrus/CyrusSecurityLayer.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/cyrus/CyrusSecurityLayer.cpp?rev=1087047&r1=1087046&r2=1087047&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/cyrus/CyrusSecurityLayer.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/cyrus/CyrusSecurityLayer.cpp Wed Mar 30 
19:11:09 2011
@@ -106,7 +106,7 @@ size_t CyrusSecurityLayer::encode(const 
 
 bool CyrusSecurityLayer::canEncode()
 {
-    return encrypted || codec->canEncode();
+    return codec && (encrypted || codec->canEncode());
 }
 
 void CyrusSecurityLayer::init(qpid::sys::Codec* c)



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:[email protected]

Reply via email to