Skip to content

Commit 8a4c586

Browse files
de-nordiccarlescufi
authored andcommitted
mgmt/mcumgr/lib: Return error on bad SMP header
The changes smp_process_request_packet to return MGMT_ERR_ECORRUPT in case when failed to read header. This helps to recognize that there will not be any response sent from mcumgr to the buffer given to smp_process_request_packet as it has not been recognized as valid request. It also removes redundant check on mgmt_streamer_init_reader which always returns 0 (no failure) in Zephyr. Signed-off-by: Dominik Ermel <[email protected]>
1 parent f4a18e4 commit 8a4c586

File tree

1 file changed

+11
-12
lines changed
  • subsys/mgmt/mcumgr/lib/smp/src

1 file changed

+11
-12
lines changed

subsys/mgmt/mcumgr/lib/smp/src/smp.c

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,8 @@ smp_on_err(struct smp_streamer *streamer, const struct mgmt_hdr *req_hdr,
289289
* @param streamer The streamer to use for reading, writing, and transmitting.
290290
* @param req A buffer containing the request packet.
291291
*
292-
* @return 0 on success, MGMT_ERR_[...] code on failure.
292+
* @return 0 on success, MGMT_ERR_ECORRUPT if buffer starts with non SMP data header,
293+
* or other MGMT_ERR_[...] code on failure.
293294
*/
294295
int
295296
smp_process_request_packet(struct smp_streamer *streamer, void *req)
@@ -298,25 +299,23 @@ smp_process_request_packet(struct smp_streamer *streamer, void *req)
298299
struct mgmt_evt_op_cmd_done_arg cmd_done_arg;
299300
void *rsp;
300301
bool valid_hdr, handler_found;
301-
int rc;
302+
int rc = 0;
302303

303304
rsp = NULL;
304-
valid_hdr = true;
305305

306-
while (1) {
307-
handler_found = false;
306+
mgmt_streamer_init_reader(&streamer->mgmt_stmr, req);
308307

309-
rc = mgmt_streamer_init_reader(&streamer->mgmt_stmr, req);
310-
if (rc != 0) {
311-
valid_hdr = false;
312-
break;
313-
}
308+
while (streamer->mgmt_stmr.reader->message_size > 0) {
309+
handler_found = false;
310+
valid_hdr = false;
314311

315312
/* Read the management header and strip it from the request. */
316313
rc = smp_read_hdr(streamer, &req_hdr);
317314
if (rc != 0) {
318-
valid_hdr = false;
315+
rc = MGMT_ERR_ECORRUPT;
319316
break;
317+
} else {
318+
valid_hdr = true;
320319
}
321320
mgmt_ntoh_hdr(&req_hdr);
322321
mgmt_streamer_trim_front(&streamer->mgmt_stmr, req, MGMT_HDR_SIZE);
@@ -367,5 +366,5 @@ smp_process_request_packet(struct smp_streamer *streamer, void *req)
367366

368367
mgmt_streamer_free_buf(&streamer->mgmt_stmr, req);
369368
mgmt_streamer_free_buf(&streamer->mgmt_stmr, rsp);
370-
return 0;
369+
return rc;
371370
}

0 commit comments

Comments
 (0)