From: Willy Tarreau Date: Wed, 24 Feb 2021 10:11:06 +0000 (+0100) Subject: BUG/MEDIUM: cli/shutdown sessions: make it thread-safe X-Git-Tag: v2.4-dev10~70 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3f5dd2945ccbed6b4baf23a453e9d1d071a2d835;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/src/stream.c b/src/stream.c index 6d534cdec2..1dfbd361ac 100644 --- a/src/stream.c +++ b/src/stream.c @@ -3444,17 +3444,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; }