@@ -62,29 +62,54 @@ class RpcDecoder {
6262 MsgPack::Unpacker unpacker;
6363 unpacker.clear ();
6464
65- size_t res_size = get_packet_size ();
66- if (!unpacker.feed (_raw_buffer, res_size)) return false ;
65+ if (!unpacker.feed (_raw_buffer, _packet_size)) return false ;
6766
6867 MsgPack::arr_size_t resp_size;
6968 int resp_type;
7069 uint32_t resp_id;
7170
7271 if (!unpacker.deserialize (resp_size, resp_type, resp_id)) return false ;
73- if (resp_size. size () != RESPONSE_SIZE) return false ;
74- if (resp_type != RESP_MSG) return false ;
72+
73+ // ReSharper disable once CppDFAUnreachableCode
7574 if (resp_id != msg_id) return false ;
7675
76+ // msg_id OK packet will be consumed.
77+ if (resp_type != RESP_MSG) {
78+ // This should never happen
79+ error.code = PARSING_ERR;
80+ error.traceback = " Unexpected response type" ;
81+ discard ();
82+ return true ;
83+ }
84+
85+ if (resp_size.size () != RESPONSE_SIZE) {
86+ // This should never happen
87+ error.code = PARSING_ERR;
88+ error.traceback = " Unexpected RPC response size" ;
89+ discard ();
90+ return true ;
91+ }
92+
7793 MsgPack::object::nil_t nil;
7894 if (unpacker.unpackable (nil)){ // No error
79- if (!unpacker.deserialize (nil, result)) return false ;
95+ if (!unpacker.deserialize (nil, result)) {
96+ error.code = PARSING_ERR;
97+ error.traceback = " Result not parsable (check type)" ;
98+ discard ();
99+ return true ;
100+ }
80101 } else { // RPC returned an error
81- if (!unpacker.deserialize (error, nil)) return false ;
102+ if (!unpacker.deserialize (error, nil)) {
103+ error.code = PARSING_ERR;
104+ error.traceback = " RPC Error not parsable (check type)" ;
105+ discard ();
106+ return true ;
107+ }
82108 }
83109
110+ consume (_packet_size);
84111 reset_packet ();
85- consume (res_size);
86112 return true ;
87-
88113 }
89114
90115 bool send_response (const MsgPack::Packer& packer) const {
@@ -103,8 +128,7 @@ class RpcDecoder {
103128
104129 unpacker.clear ();
105130 if (!unpacker.feed (_raw_buffer, _packet_size)) { // feed should not fail at this point
106- consume (_packet_size);
107- reset_packet ();
131+ discard ();
108132 return " " ;
109133 };
110134
@@ -113,27 +137,24 @@ class RpcDecoder {
113137 MsgPack::arr_size_t req_size;
114138
115139 if (!unpacker.deserialize (req_size, msg_type)) {
116- consume (_packet_size);
117- reset_packet ();
140+ discard ();
118141 return " " ; // Header not unpackable
119142 }
120143
144+ // ReSharper disable once CppDFAUnreachableCode
121145 if (msg_type == CALL_MSG && req_size.size () == REQUEST_SIZE) {
122146 uint32_t msg_id;
123147 if (!unpacker.deserialize (msg_id, method)) {
124- consume (_packet_size);
125- reset_packet ();
148+ discard ();
126149 return " " ; // Method not unpackable
127150 }
128151 } else if (msg_type == NOTIFY_MSG && req_size.size () == NOTIFY_SIZE) {
129152 if (!unpacker.deserialize (method)) {
130- consume (_packet_size);
131- reset_packet ();
153+ discard ();
132154 return " " ; // Method not unpackable
133155 }
134156 } else {
135- consume (_packet_size);
136- reset_packet ();
157+ discard ();
137158 return " " ; // Invalid request size/type
138159 }
139160
@@ -183,11 +204,13 @@ class RpcDecoder {
183204
184205 if (type != CALL_MSG && type != RESP_MSG && type != NOTIFY_MSG) {
185206 consume (bytes_checked);
207+ _discarded_packets++;
186208 break ; // Not a valid RPC type (could be type=WRONG_MSG)
187209 }
188210
189211 if ((type == CALL_MSG && container_size != REQUEST_SIZE) || (type == RESP_MSG && container_size != RESPONSE_SIZE) || (type == NOTIFY_MSG && container_size != NOTIFY_SIZE)) {
190212 consume (bytes_checked);
213+ _discarded_packets++;
191214 break ; // Not a valid RPC format
192215 }
193216
@@ -210,6 +233,8 @@ class RpcDecoder {
210233
211234 size_t size () const {return _bytes_stored;}
212235
236+ uint32_t get_discarded_packets () const {return _discarded_packets;}
237+
213238 friend class DecoderTester ;
214239
215240private:
@@ -219,6 +244,7 @@ class RpcDecoder {
219244 int _packet_type = NO_MSG;
220245 size_t _packet_size = 0 ;
221246 uint32_t _msg_id = 0 ;
247+ uint32_t _discarded_packets = 0 ;
222248
223249 bool buffer_full () const { return _bytes_stored == BufferSize; }
224250
@@ -252,6 +278,11 @@ class RpcDecoder {
252278 return consume (packet_size);
253279 }
254280
281+ void discard () {
282+ consume (_packet_size);
283+ reset_packet ();
284+ _discarded_packets++;
285+ }
255286
256287 void reset_packet () {
257288 _packet_type = NO_MSG;
0 commit comments