From 4ee065df7937e6d45ac04fd0d7bf2e3b2bef0c10 Mon Sep 17 00:00:00 2001 From: Piyush Shah Date: Tue, 6 Aug 2019 19:30:58 +0530 Subject: [PATCH] httpd_sess_close: Check for session validity before closing 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 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/components/esp_http_server/src/httpd_sess.c b/components/esp_http_server/src/httpd_sess.c index c56c22efa..4387d582a 100644 --- a/components/esp_http_server/src/httpd_sess.c +++ b/components/esp_http_server/src/httpd_sess.c @@ -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);