Limit ZMQ RPC requests to 999999 bytes at CPP side. (check also unzipped size) 20/4320/1
authorYaroslav Brustinov <[email protected]>
Sat, 10 Dec 2016 12:18:41 +0000 (14:18 +0200)
committerYaroslav Brustinov <[email protected]>
Sat, 10 Dec 2016 12:18:41 +0000 (14:18 +0200)
Change-Id: Ic592d40678e9918f7d06b9ce4269a330c4455b3c
Signed-off-by: Yaroslav Brustinov <[email protected]>
src/rpc-server/trex_rpc_jsonrpc_v2_parser.cpp
src/rpc-server/trex_rpc_jsonrpc_v2_parser.h
src/rpc-server/trex_rpc_req_resp_server.cpp

index 4fa2447..d08de4e 100644 (file)
@@ -235,3 +235,12 @@ TrexJsonRpcV2Parser::generate_common_error(Json::Value &json, const std::string
 
 }
 
+void
+TrexJsonRpcV2Parser::generate_common_error(std::string &response, const std::string &specific_err) {
+    Json::Value resp_json;
+    Json::FastWriter writer;
+
+    generate_common_error(resp_json, specific_err);
+    response = writer.write(resp_json);
+}
+
index 0563f21..d91cbe2 100644 (file)
@@ -88,6 +88,15 @@ public:
      */
     static void generate_common_error(Json::Value &json, const std::string &specific_err);
 
+    /**
+     * will generate a valid JSON RPC v2 error message with 
+     * generic error code and message 
+     * 
+     * @author imarom (16-Sep-15)
+     * 
+     */
+    static void generate_common_error(std::string &response, const std::string &specific_err);
+
     /**
      * *tries* to generate a pretty string from JSON 
      * if json_str is not a valid JSON string 
index 729917c..e762b8c 100644 (file)
@@ -172,13 +172,12 @@ 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;
+        std::string err_msg = "Request is too large (" + std::to_string(request.size()) + " bytes). Consider splitting to smaller chunks.";
+        TrexJsonRpcV2Parser::generate_common_error(response, err_msg);
+    } else {
+        process_request(request, response);
     }
 
-    process_request(request, response);
-
     zmq_send(m_socket, response.c_str(), response.size(), 0);
 }
 
@@ -250,7 +249,12 @@ void TrexRpcServerReqRes::process_zipped_request(const std::string &request, std
 
     /* process the request */
     std::string raw_response;
-    process_request_raw(unzipped, raw_response);
+    if ( unzipped.size() > MAX_RPC_MSG_LEN ) {
+        std::string err_msg = "Request is too large (" + std::to_string(unzipped.size()) + " bytes). Consider splitting to smaller chunks.";
+        TrexJsonRpcV2Parser::generate_common_error(raw_response, err_msg);
+    } else {
+        process_request_raw(unzipped, raw_response);
+    }
 
     TrexRpcZip::compress(raw_response, response);
 
@@ -262,18 +266,14 @@ void TrexRpcServerReqRes::process_zipped_request(const std::string &request, std
  */
 void 
 TrexRpcServerReqRes::handle_server_error(const std::string &specific_err) {
-    Json::FastWriter writer;
-    Json::Value response;
+    std::string response;
 
     /* generate error */
     TrexJsonRpcV2Parser::generate_common_error(response, specific_err);
 
-     /* write the JSON to string and sever on ZMQ */
-    std::string response_str = writer.write(response);
-    
-    verbose_json("Server Replied:  ", response_str);
+    verbose_json("Server Replied:  ", response);
 
-    zmq_send(m_socket, response_str.c_str(), response_str.size(), 0);
+    zmq_send(m_socket, response.c_str(), response.size(), 0);
 }