@@ -62,35 +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
72- 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 ;
71+ if (!unpacker.deserialize (resp_size, resp_type, resp_id)) {
72+ error.code = PARSING_ERR;
73+ error.traceback = " Non parsable RPC response headers (check type)" ;
74+ discard ();
75+ return false ;
76+ }
77+ if (resp_size.size () != RESPONSE_SIZE) {
78+ error.code = PARSING_ERR;
79+ error.traceback = " Wrong RPC response size" ;
80+ discard ();
81+ return false ;
82+ }
83+ if (resp_type != RESP_MSG) {
84+ // This should never happen
85+ error.code = GENERIC_ERR;
86+ error.traceback = " Unexpected response type" ;
87+ discard ();
88+ return false ;
89+ }
90+
91+ // DO NOT MODIFY THIS if resp_id is not what is expected then the RPC response belongs to s/o else
7592 if (resp_id != msg_id) return false ;
7693
7794 MsgPack::object::nil_t nil;
7895 if (unpacker.unpackable (nil)){ // No error
7996 if (!unpacker.deserialize (nil, result)) {
8097 error.code = PARSING_ERR;
8198 error.traceback = " Result not parsable (check type)" ;
99+ discard ();
82100 return false ;
83101 }
84102 } else { // RPC returned an error
85103 if (!unpacker.deserialize (error, nil)) {
86104 error.code = PARSING_ERR;
87105 error.traceback = " RPC Error not parsable (check type)" ;
106+ discard ();
88107 return false ;
89108 }
90109 }
91110
111+ consume (_packet_size);
92112 reset_packet ();
93- consume (res_size);
94113 return true ;
95114
96115 }
@@ -111,8 +130,7 @@ class RpcDecoder {
111130
112131 unpacker.clear ();
113132 if (!unpacker.feed (_raw_buffer, _packet_size)) { // feed should not fail at this point
114- consume (_packet_size);
115- reset_packet ();
133+ discard ();
116134 return " " ;
117135 };
118136
@@ -121,27 +139,23 @@ class RpcDecoder {
121139 MsgPack::arr_size_t req_size;
122140
123141 if (!unpacker.deserialize (req_size, msg_type)) {
124- consume (_packet_size);
125- reset_packet ();
142+ discard ();
126143 return " " ; // Header not unpackable
127144 }
128145
129146 if (msg_type == CALL_MSG && req_size.size () == REQUEST_SIZE) {
130147 uint32_t msg_id;
131148 if (!unpacker.deserialize (msg_id, method)) {
132- consume (_packet_size);
133- reset_packet ();
149+ discard ();
134150 return " " ; // Method not unpackable
135151 }
136152 } else if (msg_type == NOTIFY_MSG && req_size.size () == NOTIFY_SIZE) {
137153 if (!unpacker.deserialize (method)) {
138- consume (_packet_size);
139- reset_packet ();
154+ discard ();
140155 return " " ; // Method not unpackable
141156 }
142157 } else {
143- consume (_packet_size);
144- reset_packet ();
158+ discard ();
145159 return " " ; // Invalid request size/type
146160 }
147161
@@ -260,6 +274,10 @@ class RpcDecoder {
260274 return consume (packet_size);
261275 }
262276
277+ void discard () {
278+ consume (_packet_size);
279+ reset_packet ();
280+ }
263281
264282 void reset_packet () {
265283 _packet_type = NO_MSG;
0 commit comments