]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: applet: replace cs_applet_shut() with appctx_shut()
authorWilly Tarreau <w@1wt.eu>
Tue, 10 May 2022 17:42:22 +0000 (19:42 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 13 May 2022 12:28:48 +0000 (14:28 +0200)
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.

include/haproxy/applet.h
src/applet.c
src/conn_stream.c

index f646a05449dbe759c53401b819cb309f7b0d3662..fdfc1ee021678d3cbd8fbca062df19d42601a520 100644 (file)
@@ -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);
 
index 9149af4431fd285a3154393e7f6c4f946be7230d..35fd8e1a2e551cc71c3d443464a0d4c236f20435 100644 (file)
@@ -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
  * <appctx> is woken up if an input buffer was requested for the associated
  * conn-stream. In this case the buffer is immediately allocated and the
index 819f2cb4a54209fca38117ddaa69de7f01409d3d..ff8704f5f305f1257e88160faaf3669b3b264433 100644 (file)
@@ -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: