shell: Consume all input data #15224
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
A transport may receive multiple bytes of data between shell_thread wakeups, but state_collect is only called once per wakeup. So it must process all data, and only return when all data from the transport has been consumed. This is mostly handled correctly, but there were two places where state_collect would return early instead.
Since one of those places was after executing a command, this bug was easy to reproduce by pasting multiple lines of data at once. The actual behavior is messy depending on timing and whether the shell_uart RX buffer overflows -- basically it hangs without processing all input, then processes old input when new input comes in, etc.
With this I can now paste multiple line commands into the shell.
Fixes #15260