summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/broker/ConnectionHandler.cpp
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2011-08-18 18:03:22 +0000
committerAlan Conway <aconway@apache.org>2011-08-18 18:03:22 +0000
commit29480062bc5dfc420d13f29880662bc47edd4bd0 (patch)
tree82e3d5d4ef5c1d207ee8ac5a023d3a0911e98585 /cpp/src/qpid/broker/ConnectionHandler.cpp
parent5e59cfc6ce8eea0c19683710707fad6d7406ba75 (diff)
downloadqpid-python-29480062bc5dfc420d13f29880662bc47edd4bd0.tar.gz
QPID-3033: Segmentation fault while processing session.attach
The initial fix for this bug was incomplete. The original bug was triggered by a faulty client sending session.attach before connection.open. The special case is when the session.attach is on channel 0. This commit fixes the broker for all cases where a faulty client sends frames before completly opening the connection. Older versions of the Java client are known to send this faulty sequence sporadically, see https://issues.apache.org/jira/browse/QPID-3042. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1159329 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/broker/ConnectionHandler.cpp')
-rw-r--r--cpp/src/qpid/broker/ConnectionHandler.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/cpp/src/qpid/broker/ConnectionHandler.cpp b/cpp/src/qpid/broker/ConnectionHandler.cpp
index 270711705e..948aa04417 100644
--- a/cpp/src/qpid/broker/ConnectionHandler.cpp
+++ b/cpp/src/qpid/broker/ConnectionHandler.cpp
@@ -68,8 +68,15 @@ void ConnectionHandler::handle(framing::AMQFrame& frame)
AMQMethodBody* method=frame.getBody()->getMethod();
Connection::ErrorListener* errorListener = handler->connection.getErrorListener();
try{
- if (!invoke(static_cast<AMQP_AllOperations::ConnectionHandler&>(*handler.get()), *method)) {
+ if (method && invoke(
+ static_cast<AMQP_AllOperations::ConnectionHandler&>(*handler), *method)) {
+ // This is a connection control frame, nothing more to do.
+ } else if (isOpen()) {
handler->connection.getChannel(frame.getChannel()).in(frame);
+ } else {
+ handler->proxy.close(
+ connection::CLOSE_CODE_FRAMING_ERROR,
+ "Connection not yet open, invalid frame received.");
}
}catch(ConnectionException& e){
if (errorListener) errorListener->connectionError(e.what());