Skip to content

Commit a593af1

Browse files
committed
feat: decoder handles RPC response PARSING_ERR discarding it
feat: RpcDecoder.discard
1 parent d374a7b commit a593af1

File tree

1 file changed

+34
-16
lines changed

1 file changed

+34
-16
lines changed

src/decoder.h

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)