From: Dmitry Klimenko Date: Tue, 18 Mar 2014 09:35:46 +0000 (-0700) Subject: APPLINK-5004; APPLINK-5005 WebSocket big msg fix X-Git-Tag: 3.5~252 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=74da1ff0a3962472dc983b32b582269441ead78b;p=profile%2Fivi%2Fsmartdevicelink.git APPLINK-5004; APPLINK-5005 WebSocket big msg fix --- diff --git a/src/thirdPartyLibs/MessageBroker/src/lib_messagebroker/websocket_handler.cpp b/src/thirdPartyLibs/MessageBroker/src/lib_messagebroker/websocket_handler.cpp index 18a07a1..471e307 100644 --- a/src/thirdPartyLibs/MessageBroker/src/lib_messagebroker/websocket_handler.cpp +++ b/src/thirdPartyLibs/MessageBroker/src/lib_messagebroker/websocket_handler.cpp @@ -78,8 +78,9 @@ namespace NsMessageBroker char* recBuffer = Buffer; unsigned int parsedBufferPosition = 0; unsigned char position = 0; // current buffer position + unsigned int size = b_size; - while (0 < b_size) { + while (0 < size) { bool fin = ((recBuffer[0] & 0x80) | (recBuffer[0] & 0x01)) == 0x81; bool rsv1 = (recBuffer[0] & 0x40) == 0x40; @@ -92,7 +93,7 @@ namespace NsMessageBroker DBG_MSG(("CWebSocketHandler::fin = %d recBuffer[0] = 0x%02X\n" " parsedlength = %d b_size= %d parsedBufferPosition = %d\n", fin, recBuffer[0], parsedBufferPosition + position, - b_size, parsedBufferPosition)); + size, parsedBufferPosition)); if (false == fin) { @@ -104,12 +105,12 @@ namespace NsMessageBroker (recBuffer[1] & 0x08) | (recBuffer[1] & 0x04) | (recBuffer[1] & 0x02) | (recBuffer[1] & 0x01)); - unsigned int size = b_size; unsigned long length = parseWebSocketDataLength(recBuffer, size); position = 2; if (length > size) { - break; + DBG_MSG_ERROR(("Incomplete message")); + return b_size; } switch(payload) { @@ -139,7 +140,7 @@ namespace NsMessageBroker DBG_MSG(("CWebSocketHandler::parseWebSocketData()maskKeys[0]:0x%02X;" " maskKeys[1]:0x%02X; maskKeys[2]:0x%02X; maskKeys[3]:0x%02X\n" , maskKeys[0], maskKeys[1], maskKeys[2], maskKeys[3])); - for( unsigned long i = position; i < position+length; i++) + for (unsigned long i = position; i < position+length; i++) { recBuffer[i] = recBuffer[i] ^ maskKeys[(i-position)%4]; } @@ -147,15 +148,15 @@ namespace NsMessageBroker DBG_MSG(("CWebSocketHandler::parseWebSocketData()length:%d; size:%d;" " position:%d\n", (int)length, size, position)); - for( unsigned long i = position; i < size, i < position+length; i++) + for (unsigned long i = position; i < size, i < position+length; i++) { Buffer[parsedBufferPosition++] = recBuffer[i]; } recBuffer += length+position; - b_size -= length+position; - + size -= length+position; } + b_size = parsedBufferPosition; return b_size; } diff --git a/src/thirdPartyLibs/MessageBroker/src/server/mb_tcpserver.cpp b/src/thirdPartyLibs/MessageBroker/src/server/mb_tcpserver.cpp index 506f359..4a96df0 100644 --- a/src/thirdPartyLibs/MessageBroker/src/server/mb_tcpserver.cpp +++ b/src/thirdPartyLibs/MessageBroker/src/server/mb_tcpserver.cpp @@ -66,11 +66,12 @@ namespace NsMessageBroker ssize_t nb = -1; std::string* pReceivingBuffer = getBufferFor(fd); - //char buf[RECV_BUFFER_LENGTH] = {'\0'}; - char* buf = (char*)calloc(RECV_BUFFER_LENGTH + pReceivingBuffer->size(),sizeof(char)); - DBG_MSG(("Left in pReceivingBuffer: %d : %s\n", pReceivingBuffer->size(),pReceivingBuffer->c_str())); - memcpy(buf, pReceivingBuffer->c_str(), pReceivingBuffer->size()); - nb = recv(fd, buf+ pReceivingBuffer->size(), MAX_RECV_DATA , 0); + std::vector buf(RECV_BUFFER_LENGTH + pReceivingBuffer->size()); + DBG_MSG(("Left in pReceivingBuffer: %d : %s\n", + pReceivingBuffer->size(), pReceivingBuffer->c_str())); + buf.assign(pReceivingBuffer->c_str(), + pReceivingBuffer->c_str() + pReceivingBuffer->size()); + nb = recv(fd, &buf[pReceivingBuffer->size()], MAX_RECV_DATA, 0); DBG_MSG(("Recieved %d from %d\n", nb, fd)); nb += pReceivingBuffer->size(); DBG_MSG(("Recieved with buffer %d from %d\n", nb, fd)); @@ -78,34 +79,27 @@ namespace NsMessageBroker if (nb > 0) { unsigned int recieved_data = nb; - char* data = buf; - if (isWebSocket(fd)) - { + if (isWebSocket(fd)) { const unsigned int data_length = - mWebSocketHandler.parseWebSocketDataLength(buf, recieved_data); + mWebSocketHandler.parseWebSocketDataLength(&buf[0], recieved_data); DBG_MSG(("Received %d actual data length %d\n", - recieved_data, data_length)); - if (data_length > RECV_BUFFER_LENGTH) { - char buf_tmp[MAX_RECV_BUFFER_LENGTH]; - memset(buf_tmp, 0 , MAX_RECV_BUFFER_LENGTH); - memcpy(buf_tmp, buf, MAX_RECV_DATA); - ssize_t recv_data = 0; - while ((data_length > recieved_data) && - (0 < (recv_data = - recv(fd, buf_tmp + recieved_data, MAX_RECV_DATA, 0)))) { - recieved_data += recv_data; - } - nb = recieved_data; - data = buf_tmp; + recieved_data, data_length)); + + if (data_length > recieved_data) { + DBG_MSG_ERROR(("Received %d actual data length %d\n", + recieved_data, data_length)); + DBG_MSG_ERROR(("Incomplete message")); + *pReceivingBuffer = std::string(&buf[0], nb); + return false; } - mWebSocketHandler.parseWebSocketData(data, (unsigned int&)nb); + mWebSocketHandler.parseWebSocketData(&buf[0], (unsigned int&)nb); } - *pReceivingBuffer = std::string(data,nb); - free(buf); - DBG_MSG(("pReceivingBuffer before onMessageReceived:%d : %s", pReceivingBuffer->size(), pReceivingBuffer->c_str())); + *pReceivingBuffer = std::string(&buf[0], nb); + DBG_MSG(("pReceivingBuffer before onMessageReceived:%d : %s", + pReceivingBuffer->size(), pReceivingBuffer->c_str())); // we need to check websocket clients here if (!checkWebSocketHandShake(fd, pReceivingBuffer)) {//JSON MESSAGE received. Send data in CMessageBroker.