Skip to content

Commit

Permalink
shell: flush RX buffer on resume to prevent unexpected commands
Browse files Browse the repository at this point in the history
Introduced an RX buffer flush in the backend when calling shell_start.
Previously, after shell_stop, the backend continued buffering data and
commands. When shell_start was called, all buffered data was processed,
leading to the potential execution of commands issued while the shell
was inactive. This update ensures the RX buffer is flushed upon
resuming the shell, preventing unexpected command execution.

Signed-off-by: Jakub Rzeszutko <jakub.rzeszutko@verkada.com>
  • Loading branch information
jakub-uC committed Oct 8, 2024
1 parent 86b6665 commit 982a06e
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 0 deletions.
8 changes: 8 additions & 0 deletions subsys/shell/shell.c
Original file line number Diff line number Diff line change
Expand Up @@ -1452,6 +1452,14 @@ int shell_start(const struct shell *sh)
z_cursor_next_line_move(sh);
state_set(sh, SHELL_STATE_ACTIVE);

/*
* If the shell is stopped with the shell_stop function, its backend remains active
* and continues to buffer incoming data. As a result, when the shell is resumed,
* all buffered data is processed, which may lead to the execution of commands
* received while the shell was stopped.
*/
z_shell_backend_rx_buffer_flush(sh);

k_mutex_unlock(&sh->ctx->wr_mtx);

return 0;
Expand Down
15 changes: 15 additions & 0 deletions subsys/shell/shell_ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -548,3 +548,18 @@ void z_shell_fprintf(const struct shell *sh,
z_shell_vfprintf(sh, color, fmt, args);
va_end(args);
}

void z_shell_backend_rx_buffer_flush(const struct shell *sh)
{
__ASSERT_NO_MSG(sh);

int32_t max_iterations = 1000;
uint8_t buf[64];
size_t count = 0;
int err;

do {
err = (void)sh->iface->api->read(sh->iface, buf,
sizeof(buf), &count);
} while (count != 0 && err == 0 && --max_iterations > 0);

Check notice on line 564 in subsys/shell/shell_ops.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

subsys/shell/shell_ops.c:564 - err = (void)sh->iface->api->read(sh->iface, buf, - sizeof(buf), &count); + err = (void)sh->iface->api->read(sh->iface, buf, sizeof(buf), &count);
}
9 changes: 9 additions & 0 deletions subsys/shell/shell_ops.h
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,15 @@ void z_shell_fprintf(const struct shell *sh, enum shell_vt100_color color,
void z_shell_vfprintf(const struct shell *sh, enum shell_vt100_color color,
const char *fmt, va_list args);

/**
* @brief Flushes the shell backend receive buffer.
*
* This function repeatedly reads from the shell interface's receive buffer
* until it is empty or a maximum number of iterations is reached.
* It ensures that no additional data is left in the buffer.
*/
void z_shell_backend_rx_buffer_flush(const struct shell *sh);

#ifdef __cplusplus
}
#endif
Expand Down

0 comments on commit 982a06e

Please sign in to comment.