From 18ebfe59d043f8b53bdd0c7ed48e2c9920abb881 Mon Sep 17 00:00:00 2001 From: Eric Holmberg Date: Thu, 20 Jun 2024 14:08:30 +1200 Subject: [PATCH] drivers: serial: esp32_usb: fix interrupt-enable race condition After enabling interrupts, serial_esp32_usb_irq_tx_enable() calls the interrupt handler to handle any old events that occurred while interrupts were disabled. However, this happens in the callers context, so if an interrupt arrives during the call, it will call the interrupt handler again resulting in corruption if the interrupt handler is not reentrant. Fixes #74569 Signed-off-by: Eric Holmberg --- drivers/serial/serial_esp32_usb.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/serial/serial_esp32_usb.c b/drivers/serial/serial_esp32_usb.c index 5b26ca00863..c4b87d17643 100644 --- a/drivers/serial/serial_esp32_usb.c +++ b/drivers/serial/serial_esp32_usb.c @@ -142,7 +142,9 @@ static void serial_esp32_usb_irq_tx_enable(const struct device *dev) usb_serial_jtag_ll_ena_intr_mask(USB_SERIAL_JTAG_INTR_SERIAL_IN_EMPTY); if (data->irq_cb != NULL) { + unsigned int key = irq_lock(); data->irq_cb(dev, data->irq_cb_data); + arch_irq_unlock(key); } } @@ -220,8 +222,8 @@ static void serial_esp32_usb_irq_callback_set(const struct device *dev, { struct serial_esp32_usb_data *data = dev->data; - data->irq_cb = cb; data->irq_cb_data = cb_data; + data->irq_cb = cb; } static void serial_esp32_usb_isr(void *arg)