Limit ZMQ RPC requests to 999999 bytes at CPP side. TODO: split requests at Python... 19/4319/1
authorYaroslav Brustinov <[email protected]>
Sat, 10 Dec 2016 10:11:19 +0000 (12:11 +0200)
committerYaroslav Brustinov <[email protected]>
Sat, 10 Dec 2016 10:11:19 +0000 (12:11 +0200)
Change-Id: Ieaf477d2ed8264e30a8275a75d597fdc8858da79
Signed-off-by: Yaroslav Brustinov <[email protected]>
scripts/automation/trex_control_plane/stl/trex_stl_lib/trex_stl_jsonrpc_client.py
scripts/automation/trex_control_plane/stl/trex_stl_lib/utils/zipmsg.py
src/rpc-server/trex_rpc_req_resp_server.cpp
src/rpc-server/trex_rpc_req_resp_server.h

index 93a930e..ce430e2 100644 (file)
@@ -130,13 +130,13 @@ class JsonRpcClient(object):
 
         if self.zipper.check_threshold(buffer):
             response = self.send_raw_msg(self.zipper.compress(buffer))
-            if response:
-                response = self.zipper.decompress(response)
         else:
             response = self.send_raw_msg(buffer)
 
         if not response:
             return response
+        elif self.zipper.is_compressed(response):
+            response = self.zipper.decompress(response)
 
         # return to string
         response = response.decode()
index 397ada1..a2a4792 100644 (file)
@@ -6,7 +6,7 @@ class ZippedMsg:
     MSG_COMPRESS_THRESHOLD    = 256
     MSG_COMPRESS_HEADER_MAGIC = 0xABE85CEA
 
-    def check_threshold (self, msg):
+    def check_threshold(self, msg):
         return len(msg) >= self.MSG_COMPRESS_THRESHOLD
 
     def compress (self, msg):
@@ -16,7 +16,7 @@ class ZippedMsg:
         return new_msg
 
 
-    def decompress (self, msg):
+    def decompress(self, msg):
         if len(msg) < 8:
             return None
 
@@ -30,3 +30,15 @@ class ZippedMsg:
 
         return x
 
+
+    def is_compressed(self, msg):
+        if len(msg) < 8:
+            return False
+
+        t = struct.unpack(">II", msg[:8])
+        if (t[0] != self.MSG_COMPRESS_HEADER_MAGIC):
+            return False
+
+        return True
+
+
index 28bf1d8..729917c 100644 (file)
@@ -171,6 +171,12 @@ void TrexRpcServerReqRes::_stop_rpc_thread() {
 void TrexRpcServerReqRes::handle_request(const std::string &request) {
     std::string response;
 
+    if ( request.size() > MAX_RPC_MSG_LEN ) {
+        response = "Request is too large (" + std::to_string(request.size()) + " bytes). Consider splitting to smaller chunks.";
+        handle_server_error(response);
+        return;
+    }
+
     process_request(request, response);
 
     zmq_send(m_socket, response.c_str(), response.size(), 0);
index 92d51a2..9a99404 100644 (file)
@@ -53,6 +53,7 @@ protected:
 
     void               *m_context;
     void               *m_socket;
+    static const uint32_t MAX_RPC_MSG_LEN = 999999;
 };
 
 /**