forked from espressif/esp-idf
Merge branch 'fix/coverity_check_in_twai_spi_slave_and_hd' into 'master'
fix(driver_spi): coverity check in twai spi slave and slave_hd Closes IDF-9561, IDF-9826, IDF-9832, IDF-9834, IDF-9844, IDF-9863, IDF-9864, IDF-11717, and IDF-11765 See merge request espressif/esp-idf!36386
This commit is contained in:
@@ -293,6 +293,7 @@ static void twai_intr_handler_main(void *arg)
|
|||||||
static void twai_configure_gpio(twai_obj_t *p_obj)
|
static void twai_configure_gpio(twai_obj_t *p_obj)
|
||||||
{
|
{
|
||||||
uint8_t controller_id = p_obj->controller_id;
|
uint8_t controller_id = p_obj->controller_id;
|
||||||
|
assert(GPIO_IS_VALID_OUTPUT_GPIO(p_obj->tx_io)); //coverity check
|
||||||
uint64_t gpio_mask = BIT64(p_obj->tx_io);
|
uint64_t gpio_mask = BIT64(p_obj->tx_io);
|
||||||
|
|
||||||
//Set RX pin
|
//Set RX pin
|
||||||
@@ -330,6 +331,7 @@ static void twai_configure_gpio(twai_obj_t *p_obj)
|
|||||||
static void twai_release_gpio(twai_obj_t *p_obj)
|
static void twai_release_gpio(twai_obj_t *p_obj)
|
||||||
{
|
{
|
||||||
assert(p_obj);
|
assert(p_obj);
|
||||||
|
assert(GPIO_IS_VALID_OUTPUT_GPIO(p_obj->tx_io)); //coverity check
|
||||||
uint64_t gpio_mask = BIT64(p_obj->tx_io);
|
uint64_t gpio_mask = BIT64(p_obj->tx_io);
|
||||||
|
|
||||||
esp_rom_gpio_connect_in_signal(GPIO_MATRIX_CONST_ONE_INPUT, twai_controller_periph_signals.controllers[p_obj->controller_id].rx_sig, false);
|
esp_rom_gpio_connect_in_signal(GPIO_MATRIX_CONST_ONE_INPUT, twai_controller_periph_signals.controllers[p_obj->controller_id].rx_sig, false);
|
||||||
|
@@ -471,7 +471,7 @@ esp_err_t SPI_SLAVE_ATTR spi_slave_queue_reset(spi_host_device_t host)
|
|||||||
|
|
||||||
spi_slave_trans_priv_t trans;
|
spi_slave_trans_priv_t trans;
|
||||||
while (uxQueueMessagesWaiting(spihost[host]->trans_queue)) {
|
while (uxQueueMessagesWaiting(spihost[host]->trans_queue)) {
|
||||||
xQueueReceive(spihost[host]->trans_queue, &trans, 0);
|
SPI_CHECK(pdTRUE == xQueueReceive(spihost[host]->trans_queue, &trans, 0), "can't reset queue", ESP_ERR_INVALID_STATE);
|
||||||
spi_slave_uninstall_priv_trans(host, &trans);
|
spi_slave_uninstall_priv_trans(host, &trans);
|
||||||
}
|
}
|
||||||
spihost[host]->cur_trans.trans = NULL;
|
spihost[host]->cur_trans.trans = NULL;
|
||||||
@@ -524,15 +524,20 @@ esp_err_t SPI_SLAVE_ISR_ATTR spi_slave_queue_reset_isr(spi_host_device_t host)
|
|||||||
ESP_RETURN_ON_FALSE_ISR(is_valid_host(host), ESP_ERR_INVALID_ARG, SPI_TAG, "invalid host");
|
ESP_RETURN_ON_FALSE_ISR(is_valid_host(host), ESP_ERR_INVALID_ARG, SPI_TAG, "invalid host");
|
||||||
ESP_RETURN_ON_FALSE_ISR(spihost[host], ESP_ERR_INVALID_ARG, SPI_TAG, "host not slave");
|
ESP_RETURN_ON_FALSE_ISR(spihost[host], ESP_ERR_INVALID_ARG, SPI_TAG, "host not slave");
|
||||||
|
|
||||||
|
esp_err_t err = ESP_OK;
|
||||||
spi_slave_trans_priv_t trans;
|
spi_slave_trans_priv_t trans;
|
||||||
BaseType_t do_yield = pdFALSE;
|
BaseType_t do_yield = pdFALSE;
|
||||||
while (pdFALSE == xQueueIsQueueEmptyFromISR(spihost[host]->trans_queue)) {
|
while (pdFALSE == xQueueIsQueueEmptyFromISR(spihost[host]->trans_queue)) {
|
||||||
xQueueReceiveFromISR(spihost[host]->trans_queue, &trans, &do_yield);
|
if (pdTRUE != xQueueReceiveFromISR(spihost[host]->trans_queue, &trans, &do_yield)) {
|
||||||
|
err = ESP_ERR_INVALID_STATE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
spi_slave_uninstall_priv_trans(host, &trans);
|
spi_slave_uninstall_priv_trans(host, &trans);
|
||||||
}
|
}
|
||||||
if (do_yield) {
|
if (do_yield) {
|
||||||
portYIELD_FROM_ISR();
|
portYIELD_FROM_ISR();
|
||||||
}
|
}
|
||||||
|
ESP_RETURN_ON_ERROR_ISR(err, SPI_TAG, "can't reset queue");
|
||||||
|
|
||||||
spihost[host]->cur_trans.trans = NULL;
|
spihost[host]->cur_trans.trans = NULL;
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
|
@@ -437,7 +437,7 @@ static IRAM_ATTR void s_spi_slave_hd_segment_isr(void *arg)
|
|||||||
bool rx_sent = false;
|
bool rx_sent = false;
|
||||||
if (!host->tx_curr_trans.trans) {
|
if (!host->tx_curr_trans.trans) {
|
||||||
ret = xQueueReceiveFromISR(host->tx_trans_queue, &host->tx_curr_trans, &awoken);
|
ret = xQueueReceiveFromISR(host->tx_trans_queue, &host->tx_curr_trans, &awoken);
|
||||||
if (ret == pdTRUE) {
|
if ((ret == pdTRUE) && host->tx_curr_trans.trans) {
|
||||||
spicommon_dma_desc_setup_link(hal->dmadesc_tx->desc, host->tx_curr_trans.aligned_buffer, host->tx_curr_trans.trans->len, false);
|
spicommon_dma_desc_setup_link(hal->dmadesc_tx->desc, host->tx_curr_trans.aligned_buffer, host->tx_curr_trans.trans->len, false);
|
||||||
spi_dma_reset(host->dma_ctx->tx_dma_chan);
|
spi_dma_reset(host->dma_ctx->tx_dma_chan);
|
||||||
spi_slave_hd_hal_txdma(hal);
|
spi_slave_hd_hal_txdma(hal);
|
||||||
@@ -456,7 +456,7 @@ static IRAM_ATTR void s_spi_slave_hd_segment_isr(void *arg)
|
|||||||
}
|
}
|
||||||
if (!host->rx_curr_trans.trans) {
|
if (!host->rx_curr_trans.trans) {
|
||||||
ret = xQueueReceiveFromISR(host->rx_trans_queue, &host->rx_curr_trans, &awoken);
|
ret = xQueueReceiveFromISR(host->rx_trans_queue, &host->rx_curr_trans, &awoken);
|
||||||
if (ret == pdTRUE) {
|
if ((ret == pdTRUE) && host->rx_curr_trans.trans) {
|
||||||
spicommon_dma_desc_setup_link(hal->dmadesc_rx->desc, host->rx_curr_trans.aligned_buffer, host->rx_curr_trans.trans->len, true);
|
spicommon_dma_desc_setup_link(hal->dmadesc_rx->desc, host->rx_curr_trans.aligned_buffer, host->rx_curr_trans.trans->len, true);
|
||||||
spi_dma_reset(host->dma_ctx->rx_dma_chan);
|
spi_dma_reset(host->dma_ctx->rx_dma_chan);
|
||||||
spi_slave_hd_hal_rxdma(hal);
|
spi_slave_hd_hal_rxdma(hal);
|
||||||
|
Reference in New Issue
Block a user