]> granicus.if.org Git - esp-idf/commitdiff
httpd_sess_close: Check for session validity before closing
authorPiyush Shah <piyush@espressif.com>
Tue, 6 Aug 2019 14:00:58 +0000 (19:30 +0530)
committerPiyush Shah <piyush@espressif.com>
Tue, 6 Aug 2019 14:01:57 +0000 (19:31 +0530)
If httpd_sess_trigger_close() gets called twice for the same socket,
the first httpd_sess_close() cb closes the correct socket, but the second
invocation closes the wrong socket which was just accepted and added to
the socket db. Checking for the lru counter will help identify this as the
counter is set only for requests actually served.

components/esp_http_server/src/httpd_sess.c

index 8109475b4cd4dcea02d95b4d6deb345967d2a8d7..9deb6df2fe958a6bcb8dc9504b9797b953d45b63 100644 (file)
@@ -378,6 +378,10 @@ static void httpd_sess_close(void *arg)
 {
     struct sock_db *sock_db = (struct sock_db *)arg;
     if (sock_db) {
+        if (sock_db->lru_counter == 0) {
+            ESP_LOGD(TAG, "Skipping session close for %d as it seems to be a race condition", sock_db->fd);
+            return;
+        }
         int fd = sock_db->fd;
         struct httpd_data *hd = (struct httpd_data *) sock_db->handle;
         httpd_sess_delete(hd, fd);