From 7c06b5790d879c216ad27f8e281789b35858db43 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Mon, 20 Feb 2023 15:14:04 -0800 Subject: session: track app session closes Make sure applications, especially builtin ones, cannot close a session multiple times. Type: improvement Signed-off-by: Florin Coras Change-Id: I960a1ae89a48eb359e7e1873a59d47c298c37ef1 --- src/vnet/session/session.c | 8 +++++++- src/vnet/session/session_types.h | 3 ++- 2 files changed, 9 insertions(+), 2 deletions(-) (limited to 'src/vnet/session') diff --git a/src/vnet/session/session.c b/src/vnet/session/session.c index eaba80f24e2..b0dbb9ddfe8 100644 --- a/src/vnet/session/session.c +++ b/src/vnet/session/session.c @@ -1526,9 +1526,15 @@ session_half_close (session_t *s) void session_close (session_t * s) { - if (!s) + if (!s || (s->flags & SESSION_F_APP_CLOSED)) return; + /* Transports can close and delete their state independent of app closes + * and transport initiated state transitions can hide app closes. Instead + * of extending the state machine to support separate tracking of app and + * transport initiated closes, use a flag. */ + s->flags |= SESSION_F_APP_CLOSED; + if (s->session_state >= SESSION_STATE_CLOSING) { /* Session will only be removed once both app and transport diff --git a/src/vnet/session/session_types.h b/src/vnet/session/session_types.h index dcbbd72ef8e..513929a8354 100644 --- a/src/vnet/session/session_types.h +++ b/src/vnet/session/session_types.h @@ -173,7 +173,8 @@ typedef enum _ (IS_MIGRATING, "migrating") \ _ (UNIDIRECTIONAL, "unidirectional") \ _ (CUSTOM_FIFO_TUNING, "custom-fifo-tuning") \ - _ (HALF_OPEN, "half-open") + _ (HALF_OPEN, "half-open") \ + _ (APP_CLOSED, "app-closed") typedef enum session_flags_bits_ { -- cgit 1.2.3-korg