spi: axi-spi-engine: fix use after free after timeout #2292
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.
This fixes a use after free that can happen if the watchdog timer times out on an SPI message then another message is attempted.
The following struct spi_engine members point to memory managed by the spi framework
During normal operation, tx_xfer and rx_xfer set to NULL by spi_engine_xfer_next() when the last xfer of a message is completed. However, this code path is not taken when the watchdog timer times out and therefore tx_xfer and rx_xfer are not set to NULL and still point to memory that gets freed by spi_finalize_current_message().
When the next message is attempted, spi_engine_transfer_one() will call spi_engine_xfer_next() with the old pointers and will attempt to dereference them. This can cause a crash.
To fix this, always set tx_xfer and rx_xfer to NULL before calling spi_finalize_current_message().
Fixes: fde5597 ("spi: axi-spi-engine: Add watchdog timer")
Fixes: #2287