Fix bug in receiving requests in libcynara-agent 17/36217/3
authorLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Tue, 3 Mar 2015 13:26:11 +0000 (14:26 +0100)
committerLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Mon, 9 Mar 2015 11:38:44 +0000 (12:38 +0100)
Method AgentSocketClient::receiveResponseFromServer should hang
until it can return a request received from cynara service.

However a single read from socket can read more than one request.
Received requests are queued.

Code did not check if there is a valid request read and queued
previously, but always tried to read from socket.

Fix changes order - so now code first checks queue and only in case,
when there is no valid request waiting a socket is read.

Change-Id: I845cd677700e516f252a8958b97ee8facb82170f

src/agent/socket/AgentSocketClient.cpp

index 780c996..0e576ed 100644 (file)
@@ -56,17 +56,14 @@ ResponsePtr AgentSocketClient::askCynaraServer(RequestPtr request) {
 }
 
 ResponsePtr AgentSocketClient::receiveResponseFromServer(void) {
-    while (true) {
+    ResponsePtr response;
+    while (!(response = m_protocol->extractResponseFromBuffer(m_readQueue))) {
         if (!m_socket.receiveFromServer(*m_readQueue)) {
             LOGW("Error receiving data from Cynara. Service not available.");
             return nullptr;
         }
-
-        ResponsePtr response = m_protocol->extractResponseFromBuffer(m_readQueue);
-        if (response) {
-            return response;
-        }
     }
+    return response;
 }
 
 bool AgentSocketClient::sendDataToServer(BinaryQueue &data) {