From f5acc1e446344331be01a56224a5c683f922ce07 Mon Sep 17 00:00:00 2001 From: Shubham Kulkarni Date: Mon, 30 Nov 2020 12:33:31 +0530 Subject: [PATCH] esp_http_server: Add lru_socket flag in sock_db to indicate httpd_sess_close is called from httpd_sess_close_lru --- components/esp_http_server/src/esp_httpd_priv.h | 1 + components/esp_http_server/src/httpd_main.c | 2 -- components/esp_http_server/src/httpd_sess.c | 5 ++++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/components/esp_http_server/src/esp_httpd_priv.h b/components/esp_http_server/src/esp_httpd_priv.h index d0cdfd0fda..c570a1c2fd 100644 --- a/components/esp_http_server/src/esp_httpd_priv.h +++ b/components/esp_http_server/src/esp_httpd_priv.h @@ -69,6 +69,7 @@ struct sock_db { httpd_recv_func_t recv_fn; /*!< Receive function for this socket */ httpd_pending_func_t pending_fn; /*!< Pending function for this socket */ uint64_t lru_counter; /*!< LRU Counter indicating when the socket was last used */ + bool lru_socket; /*!< Flag indicating LRU socket */ char pending_data[PARSER_BLOCK_SIZE]; /*!< Buffer for pending data to be received */ size_t pending_len; /*!< Length of pending data to be received */ }; diff --git a/components/esp_http_server/src/httpd_main.c b/components/esp_http_server/src/httpd_main.c index e51cc7b858..e19ac9af5c 100644 --- a/components/esp_http_server/src/httpd_main.c +++ b/components/esp_http_server/src/httpd_main.c @@ -67,8 +67,6 @@ static esp_err_t httpd_accept_conn(struct httpd_data *hd, int listen_fd) close(new_fd); return ESP_FAIL; } - httpd_sess_update_lru_counter(hd->hd_sd->handle, new_fd); - ESP_LOGD(TAG, LOG_FMT("complete")); return ESP_OK; } diff --git a/components/esp_http_server/src/httpd_sess.c b/components/esp_http_server/src/httpd_sess.c index fb6bba1068..63dc77e34a 100644 --- a/components/esp_http_server/src/httpd_sess.c +++ b/components/esp_http_server/src/httpd_sess.c @@ -348,6 +348,8 @@ esp_err_t httpd_sess_close_lru(struct httpd_data *hd) } } ESP_LOGD(TAG, LOG_FMT("fd = %d"), lru_fd); + struct sock_db *sd = httpd_sess_get(hd, lru_fd); + sd->lru_socket = true; return httpd_sess_trigger_close(hd, lru_fd); } @@ -378,11 +380,12 @@ 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) { + if (sock_db->lru_counter == 0 && !sock_db->lru_socket) { 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; + sock_db->lru_socket = false; struct httpd_data *hd = (struct httpd_data *) sock_db->handle; httpd_sess_delete(hd, fd); close(fd);