From bb5d6e408b08d82b89e0b1e91e05a0e4c0226c18 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Bollo?= Date: Tue, 7 Nov 2017 19:25:44 +0100 Subject: [PATCH] afb-stub-ws: autoclose session on disconnection MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Change-Id: If46ca2fa34a080b7087edb4e0da109c5ee85b14f Signed-off-by: José Bollo --- src/afb-session.c | 10 +++++++++- src/afb-session.h | 1 + src/afb-stub-ws.c | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/afb-session.c b/src/afb-session.c index 1cb1d8d8..6b6ad634 100644 --- a/src/afb-session.c +++ b/src/afb-session.c @@ -57,6 +57,7 @@ struct afb_session time_t expiration; // expiration time of the token pthread_mutex_t mutex; struct cookie *cookies[COOKEYCOUNT]; + char autoclose; char idx; char uuid[SIZEUUID]; // long term authentication of remote client char token[SIZEUUID]; // short term authentication of remote client @@ -358,7 +359,7 @@ void afb_session_unref(struct afb_session *session) assert(session->refcount != 0); if (!__atomic_sub_fetch(&session->refcount, 1, __ATOMIC_RELAXED)) { pthread_mutex_lock(&session->mutex); - if (session->uuid[0] == 0) + if (session->autoclose || session->uuid[0] == 0) destroy (session); else pthread_mutex_unlock(&session->mutex); @@ -383,6 +384,13 @@ void afb_session_close (struct afb_session *session) pthread_mutex_unlock(&session->mutex); } +/* set the autoclose flag */ +void afb_session_set_autoclose(struct afb_session *session, int autoclose) +{ + assert(session != NULL); + session->autoclose = (char)!!autoclose; +} + // is the session active? int afb_session_is_active (struct afb_session *session) { diff --git a/src/afb-session.h b/src/afb-session.h index b27cbc80..d79ec414 100644 --- a/src/afb-session.h +++ b/src/afb-session.h @@ -33,6 +33,7 @@ extern const char *afb_session_uuid (struct afb_session *session); extern struct afb_session *afb_session_addref(struct afb_session *session); extern void afb_session_unref(struct afb_session *session); +extern void afb_session_set_autoclose(struct afb_session *session, int autoclose); extern void afb_session_close(struct afb_session *session); extern int afb_session_is_active (struct afb_session *session); diff --git a/src/afb-stub-ws.c b/src/afb-stub-ws.c index d5355ff8..740a8575 100644 --- a/src/afb-stub-ws.c +++ b/src/afb-stub-ws.c @@ -533,6 +533,8 @@ static void on_call(void *closure, struct afb_proto_ws_call *call, const char *v goto unconnected; wreq->xreq.context.validated = 1; record_session(stubws, wreq->xreq.context.session); + if (wreq->xreq.context.created) + afb_session_set_autoclose(wreq->xreq.context.session, 1); /* makes the call */ wreq->xreq.cred = afb_cred_addref(stubws->cred); -- 2.16.6