Author: gsim
Date: Fri Oct 12 05:06:39 2007
New Revision: 584143

URL: http://svn.apache.org/viewvc?rev=584143&view=rev
Log:
Close connection when a framing error is encountered during decoding.


Modified:
    incubator/qpid/trunk/qpid/cpp/src/qpid/sys/AsynchIOAcceptor.cpp
    incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/AsynchIO.cpp

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/sys/AsynchIOAcceptor.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/sys/AsynchIOAcceptor.cpp?rev=584143&r1=584142&r2=584143&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/sys/AsynchIOAcceptor.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/sys/AsynchIOAcceptor.cpp Fri Oct 12 
05:06:39 2007
@@ -89,12 +89,14 @@
        Mutex frameQueueLock;
        bool frameQueueClosed;
        bool initiated;
-       
+        bool readError;
+
 public:
        AsynchIOHandler() :
                inputHandler(0),
                frameQueueClosed(false),
-               initiated(false)
+               initiated(false),
+                readError(false)
        {}
        
        ~AsynchIOHandler() {
@@ -201,36 +203,41 @@
 
 // Input side
 void AsynchIOHandler::readbuff(AsynchIO& , AsynchIO::BufferBase* buff) {
-       framing::Buffer in(buff->bytes+buff->dataStart, buff->dataCount);
+    if (readError) {
+        return;
+    }
+    framing::Buffer in(buff->bytes+buff->dataStart, buff->dataCount);
     if(initiated){
         framing::AMQFrame frame;
         try{
             while(frame.decode(in)) {
                 QPID_LOG(debug, "RECV: " << frame);
-                       inputHandler->received(frame);
-               }
-               }catch(const std::exception& e){
-               QPID_LOG(error, e.what());
-               }
-       }else{
-           framing::ProtocolInitiation protocolInit;
-           if(protocolInit.decode(in)){
-               QPID_LOG(debug, "INIT [" << aio << "]");
-               inputHandler->initiated(protocolInit);
-               initiated = true;
-           }
-       }
-       // TODO: unreading needs to go away, and when we can cope
-       // with multiple sub-buffers in the general buffer scheme, it will
-       if (in.available() != 0) {
-               // Adjust buffer for used bytes and then "unread them"
-               buff->dataStart += buff->dataCount-in.available();
-               buff->dataCount = in.available();
-               aio->unread(buff);
-       } else {
-               // Give whole buffer back to aio subsystem
-               aio->queueReadBuffer(buff);
-       }
+                inputHandler->received(frame);
+            }
+        }catch(const std::exception& e){
+            QPID_LOG(error, e.what());
+            readError = true;
+            aio->queueWriteClose();
+        }
+    }else{
+        framing::ProtocolInitiation protocolInit;
+        if(protocolInit.decode(in)){
+            QPID_LOG(debug, "INIT [" << aio << "]");
+            inputHandler->initiated(protocolInit);
+            initiated = true;
+        }
+    }
+    // TODO: unreading needs to go away, and when we can cope
+    // with multiple sub-buffers in the general buffer scheme, it will
+    if (in.available() != 0) {
+        // Adjust buffer for used bytes and then "unread them"
+        buff->dataStart += buff->dataCount-in.available();
+        buff->dataCount = in.available();
+        aio->unread(buff);
+    } else {
+        // Give whole buffer back to aio subsystem
+        aio->queueReadBuffer(buff);
+    }
 }
 
 void AsynchIOHandler::eof(AsynchIO&) {
@@ -294,7 +301,7 @@
        } while (!frameQueue.empty());
 
        if (frameQueueClosed) {
-               aio->queueWriteClose();
+            aio->queueWriteClose();
        }
 }
 

Modified: incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/AsynchIO.cpp
URL: 
http://svn.apache.org/viewvc/incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/AsynchIO.cpp?rev=584143&r1=584142&r2=584143&view=diff
==============================================================================
--- incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/AsynchIO.cpp (original)
+++ incubator/qpid/trunk/qpid/cpp/src/qpid/sys/posix/AsynchIO.cpp Fri Oct 12 
05:06:39 2007
@@ -157,7 +157,8 @@
 }
 
 void AsynchIO::queueWriteClose() {
-       queuedClose = true;
+    queuedClose = true;
+    DispatchHandle::rewatchWrite();
 }
 
 /** Return a queued buffer if there are enough


Reply via email to