Просмотр исходного кода

Merge branch 'bugfix/vfs_sock_select_race' into 'master'

vfs: Fix potential select() race if both sock and other-fd trigger

Closes IDFGH-7308

See merge request espressif/esp-idf!18023
David Čermák 3 лет назад
Родитель
Сommit
285c6fc906
1 измененных файлов с 10 добавлено и 2 удалено
  1. 10 2
      components/vfs/vfs.c

+ 10 - 2
components/vfs/vfs.c

@@ -1058,8 +1058,16 @@ int esp_vfs_select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds
     if (ret >= 0) {
         ret += 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);
+    if (sel_sem.sem) { // Cleanup the select semaphore
+        if (sel_sem.is_sem_local) {
+            vSemaphoreDelete(sel_sem.sem);
+        } else if (socket_select) {
+            SemaphoreHandle_t *s = sel_sem.sem;
+            /* Select might have been triggered from both lwip and vfs fds at the same time, and
+             * we have to make sure that the lwip semaphore is cleared when we exit select().
+             * It is safe, as the semaphore belongs to the calling thread. */
+            xSemaphoreTake(*s, 0);
+        }
         sel_sem.sem = NULL;
     }
     _lock_acquire(&s_fd_table_lock);