Skip to content

Commit 05852bc

Browse files
shahpiyushvespressif-bot
authored andcommitted
protocomm_httpd: Restart security session if request is received on a new session
This commit fixes a bug as well as changes a behaviour. Bugfix: During softap/httpd based provisioning, if a session was closed midway and a new one started, it would never proceed if the http server assigns same socket number to the new session (which happens almost always). Now, if a session is closed, using the http callbacks, the older session data is cleared so that a new one can be created. Behavioural change: If a client (mobile app particularly) does not use persistent http session i.e. all provisioning communication on the same socket, the provisioning may fail. Earlier, since the session context was not getting cleared, even if the client closed a session and continued on a new one, it would go through if the socket number assigned was same (which happens almost always). Ideally, from a security perspective, all communication related to secure provisioning must happen on the same socket, and so, this change is required.
1 parent 0c0bfe7 commit 05852bc

File tree

1 file changed

+15
-0
lines changed

1 file changed

+15
-0
lines changed

components/protocomm/src/transports/protocomm_httpd.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,17 @@ static uint32_t session_id = PROTOCOMM_NO_SESSION_ID;
3131

3232
#define MAX_REQ_BODY_LEN 4096
3333

34+
static void protocomm_httpd_session_close(void *ctx)
35+
{
36+
if (pc_httpd->sec && pc_httpd->sec->close_transport_session) {
37+
ESP_LOGW(TAG, "Closing session as socket %d was closed", session_id);
38+
if (pc_httpd->sec->close_transport_session((protocomm_security_handle_t)ctx, session_id) != ESP_OK) {
39+
ESP_LOGW(TAG, "Error closing session with ID: %d", session_id);
40+
}
41+
}
42+
session_id = PROTOCOMM_NO_SESSION_ID;
43+
}
44+
3445
static esp_err_t common_post_handler(httpd_req_t *req)
3546
{
3647
esp_err_t ret;
@@ -42,6 +53,7 @@ static esp_err_t common_post_handler(httpd_req_t *req)
4253
int cur_session_id = httpd_req_to_sockfd(req);
4354

4455
if (cur_session_id != session_id) {
56+
ESP_LOGI(TAG, "Creating new session: %d", cur_session_id);
4557
/* Initialize new security session */
4658
if (session_id != PROTOCOMM_NO_SESSION_ID) {
4759
ESP_LOGD(TAG, "Closing session with ID: %d", session_id);
@@ -62,6 +74,9 @@ static esp_err_t common_post_handler(httpd_req_t *req)
6274
ret = ESP_FAIL;
6375
goto out;
6476
}
77+
req->sess_ctx = pc_httpd->sec_inst;
78+
req->free_ctx = protocomm_httpd_session_close;
79+
6580
}
6681
session_id = cur_session_id;
6782
ESP_LOGD(TAG, "New session with ID: %d", cur_session_id);

0 commit comments

Comments
 (0)