From 58e69f2fcb7195e4d0009390b27dc85e9ae4776b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20M=C3=BAdry?= Date: Mon, 22 May 2023 16:23:35 +0200 Subject: [PATCH] vfs: select sanity NULL check https://github.com/espressif/esp-idf/issues/9964 --- components/vfs/vfs.c | 8 ++++++-- components/vfs/vfs_console.c | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/components/vfs/vfs.c b/components/vfs/vfs.c index 220fa9a6ab..6adf9db139 100644 --- a/components/vfs/vfs.c +++ b/components/vfs/vfs.c @@ -999,7 +999,9 @@ int esp_vfs_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds const vfs_entry_t *vfs = get_vfs_for_index(i); fds_triple_t *item = &vfs_fds_triple[i]; - if (vfs && vfs->vfs.start_select && item->isset) { + if (vfs && !vfs->vfs.start_select) { + ESP_LOGD(TAG, "start_select function callback for this vfs (s_vfs[%d]) is not defined", vfs->offset); + } else if (vfs && vfs->vfs.start_select && item->isset) { // call start_select for all non-socket VFSs with has at least one FD set in readfds, writefds, or errorfds // note: it can point to socket VFS but item->isset will be false for that ESP_LOGD(TAG, "calling start_select for VFS ID %d with the following local FDs", i); @@ -1010,7 +1012,9 @@ int esp_vfs_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds driver_args + i); if (err != ESP_OK) { - call_end_selects(i, vfs_fds_triple, driver_args); + if (err != ESP_ERR_NOT_SUPPORTED) { + call_end_selects(i, vfs_fds_triple, driver_args); + } (void) set_global_fd_sets(vfs_fds_triple, vfs_count, readfds, writefds, errorfds); if (sel_sem.is_sem_local && sel_sem.sem) { vSemaphoreDelete(sel_sem.sem); diff --git a/components/vfs/vfs_console.c b/components/vfs/vfs_console.c index be10600b87..caf2ec1aaf 100644 --- a/components/vfs/vfs_console.c +++ b/components/vfs/vfs_console.c @@ -119,12 +119,22 @@ int console_access(const char *path, int amode) static esp_err_t console_start_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, esp_vfs_select_sem_t select_sem, void **end_select_args) { - return get_vfs_for_index(primary_vfs_index)->vfs.start_select(nfds, readfds, writefds, exceptfds, select_sem, end_select_args); + const vfs_entry_t* vfs_entry = get_vfs_for_index(primary_vfs_index); + // start_select is not guaranteed be implemented even though CONFIG_VFS_SUPPORT_SELECT is enabled in sdkconfig + if (vfs_entry && vfs_entry->vfs.start_select) { + return vfs_entry->vfs.start_select(nfds, readfds, writefds, exceptfds, select_sem, end_select_args); + } + return ESP_ERR_NOT_SUPPORTED; } esp_err_t console_end_select(void *end_select_args) { - return get_vfs_for_index(primary_vfs_index)->vfs.end_select(end_select_args); + const vfs_entry_t* vfs_entry = get_vfs_for_index(primary_vfs_index); + // end_select is not guaranteed be implemented even though CONFIG_VFS_SUPPORT_SELECT is enabled in sdkconfig + if (vfs_entry && vfs_entry->vfs.end_select) { + return vfs_entry->vfs.end_select(end_select_args); + } + return ESP_ERR_NOT_SUPPORTED; } #endif // CONFIG_VFS_SUPPORT_SELECT