From: Willy Tarreau Date: Tue, 10 May 2022 17:42:22 +0000 (+0200) Subject: MINOR: applet: replace cs_applet_shut() with appctx_shut() X-Git-Tag: v2.6-dev10~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1c3ead45a4fa6661860566c035c6655496da78c2;p=thirdparty%2Fhaproxy.git MINOR: applet: replace cs_applet_shut() with appctx_shut() The former takes a conn_stream still attached to a valid appctx, which also complicates the termination of the applet. Instead, let's pass the appctx which already points to the endpoint, this allows us to properly detach the conn_stream before the call, which is cleaner and safer. --- diff --git a/include/haproxy/applet.h b/include/haproxy/applet.h index f646a05449..fdfc1ee021 100644 --- a/include/haproxy/applet.h +++ b/include/haproxy/applet.h @@ -37,6 +37,7 @@ extern struct pool_head *pool_head_appctx; struct task *task_run_applet(struct task *t, void *context, unsigned int state); int appctx_buf_available(void *arg); void *applet_reserve_svcctx(struct appctx *appctx, size_t size); +void appctx_shut(struct appctx *appctx); struct appctx *appctx_new(struct applet *applet, struct cs_endpoint *endp); diff --git a/src/applet.c b/src/applet.c index 9149af4431..35fd8e1a2e 100644 --- a/src/applet.c +++ b/src/applet.c @@ -93,6 +93,20 @@ void *applet_reserve_svcctx(struct appctx *appctx, size_t size) return appctx->svcctx; } +/* call the applet's release() function if any, and marks the endp as shut. + * Needs to be called upon close(). + */ +void appctx_shut(struct appctx *appctx) +{ + if (appctx->endp->flags & (CS_EP_SHR|CS_EP_SHW)) + return; + + if (appctx->applet->release) + appctx->applet->release(appctx); + + appctx->endp->flags |= CS_EP_SHRR | CS_EP_SHWN; +} + /* Callback used to wake up an applet when a buffer is available. The applet * is woken up if an input buffer was requested for the associated * conn-stream. In this case the buffer is immediately allocated and the diff --git a/src/conn_stream.c b/src/conn_stream.c index 819f2cb4a5..ff8704f5f3 100644 --- a/src/conn_stream.c +++ b/src/conn_stream.c @@ -388,11 +388,11 @@ static void cs_detach_endp(struct conn_stream **csp) else if (cs->endp->flags & CS_EP_T_APPLET) { struct appctx *appctx = __cs_appctx(cs); - cs_applet_shut(cs); cs->endp->flags |= CS_EP_ORPHAN; cs->endp->cs = NULL; - appctx_free(appctx); cs->endp = NULL; + appctx_shut(appctx); + appctx_free(appctx); } if (cs->endp) { @@ -514,20 +514,6 @@ struct appctx *cs_applet_create(struct conn_stream *cs, struct applet *app) return appctx; } -/* call the applet's release function if any. Needs to be called upon close() */ -void cs_applet_shut(struct conn_stream *cs) -{ - struct appctx *appctx = __cs_appctx(cs); - - if (cs->endp->flags & (CS_EP_SHR|CS_EP_SHW)) - return; - - if (appctx->applet->release) - appctx->applet->release(appctx); - - cs->endp->flags |= CS_EP_SHRR | CS_EP_SHWN; -} - /* * This function performs a shutdown-read on a detached conn-stream in a * connected or init state (it does nothing for other states). It either shuts @@ -922,7 +908,7 @@ static void cs_app_shutr_applet(struct conn_stream *cs) return; if (cs_oc(cs)->flags & CF_SHUTW) { - cs_applet_shut(cs); + appctx_shut(__cs_appctx(cs)); cs->state = CS_ST_DIS; __cs_strm(cs)->conn_exp = TICK_ETERNITY; } @@ -980,7 +966,7 @@ static void cs_app_shutw_applet(struct conn_stream *cs) case CS_ST_QUE: case CS_ST_TAR: /* Note that none of these states may happen with applets */ - cs_applet_shut(cs); + appctx_shut(__cs_appctx(cs)); cs->state = CS_ST_DIS; /* fall through */ default: