From 642dc19c2554e376fad1bdfaff8fda5adb791688 Mon Sep 17 00:00:00 2001 From: Roland Dobai Date: Tue, 14 Jan 2020 13:48:36 +0100 Subject: [PATCH] VFS: Check in select() if the UART driver is installed or not Closes https://github.com/espressif/esp-idf/issues/4627 --- components/driver/include/driver/uart.h | 11 +++++++++++ components/driver/uart.c | 5 +++++ components/vfs/vfs_uart.c | 8 ++++++++ 3 files changed, 24 insertions(+) diff --git a/components/driver/include/driver/uart.h b/components/driver/include/driver/uart.h index 4bf855c186..5b5ffce2e4 100644 --- a/components/driver/include/driver/uart.h +++ b/components/driver/include/driver/uart.h @@ -155,6 +155,17 @@ typedef struct { typedef intr_handle_t uart_isr_handle_t; +/** + * @brief Checks whether the driver is installed or not + * + * @param uart_num UART port number, the max port number is (UART_NUM_MAX -1). + * + * @return + * - true driver is installed + * - false driver is not installed + */ +bool uart_is_driver_installed(uart_port_t uart_num); + /** * @brief Set UART data bits. * diff --git a/components/driver/uart.c b/components/driver/uart.c index dba3c585d7..8186214702 100644 --- a/components/driver/uart.c +++ b/components/driver/uart.c @@ -1485,6 +1485,11 @@ esp_err_t uart_driver_delete(uart_port_t uart_num) return ESP_OK; } +bool uart_is_driver_installed(uart_port_t uart_num) +{ + return uart_num < UART_NUM_MAX && (p_uart_obj[uart_num] != NULL); +} + void uart_set_select_notif_callback(uart_port_t uart_num, uart_select_notif_callback_t uart_select_notif_callback) { if (uart_num < UART_NUM_MAX && p_uart_obj[uart_num]) { diff --git a/components/vfs/vfs_uart.c b/components/vfs/vfs_uart.c index c413cbfb00..20cd17db77 100644 --- a/components/vfs/vfs_uart.c +++ b/components/vfs/vfs_uart.c @@ -420,6 +420,14 @@ static esp_err_t uart_start_select(int nfds, fd_set *readfds, fd_set *writefds, const int max_fds = MIN(nfds, UART_NUM); *end_select_args = NULL; + for (int i = 0; i < max_fds; ++i) { + if (FD_ISSET(i, readfds) || FD_ISSET(i, writefds) || FD_ISSET(i, exceptfds)) { + if (!uart_is_driver_installed(i)) { + return ESP_ERR_INVALID_STATE; + } + } + } + uart_select_args_t *args = malloc(sizeof(uart_select_args_t)); if (args == NULL) {