From 0200e085c25bff07e82ba17715d8cd29a1eef3fc Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 24 Feb 2021 11:11:06 +0100 Subject: [PATCH] BUG/MEDIUM: cli/shutdown sessions: make it thread-safe There's no locking around the lookup of a stream nor its shutdown when issuing "shutdown sessions" over the CLI so the risk of crashing the process is particularly high. Let's use a thread_isolate() there which is suitable for this task, and there are not that many alternatives. This must be backported to 1.8. (cherry picked from commit 3f5dd2945ccbed6b4baf23a453e9d1d071a2d835) Signed-off-by: Christopher Faulet (cherry picked from commit 9ca4d7fb602ddc3c27e9e79c60627f4a054bf75f) Signed-off-by: Christopher Faulet (cherry picked from commit a4f1b27f5075e9bf881d1f329ad30a81e0f37650) Signed-off-by: Christopher Faulet --- src/stream.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/stream.c b/src/stream.c index d6d07bc..54d7222 100644 --- a/src/stream.c +++ b/src/stream.c @@ -3877,17 +3877,22 @@ static int cli_parse_shutdown_session(char **args, char *payload, struct appctx ptr = (void *)strtoul(args[2], NULL, 0); + thread_isolate(); + /* first, look for the requested stream in the stream table */ list_for_each_entry(strm, &streams, list) { - if (strm == ptr) + if (strm == ptr) { + stream_shutdown(strm, SF_ERR_KILLED); break; + } } + thread_release(); + /* do we have the stream ? */ if (strm != ptr) return cli_err(appctx, "No such session (use 'show sess').\n"); - stream_shutdown(strm, SF_ERR_KILLED); return 1; } -- 1.7.10.4