diff --git a/include/haproxy/conn_stream.h b/include/haproxy/conn_stream.h index 5be833dbc..fa0959c6d 100644 --- a/include/haproxy/conn_stream.h +++ b/include/haproxy/conn_stream.h @@ -39,6 +39,7 @@ void cs_free(struct conn_stream *cs); void cs_attach_endp(struct conn_stream *cs, enum obj_type *endp, void *ctx); int cs_attach_app(struct conn_stream *cs, enum obj_type *app); void cs_detach_endp(struct conn_stream *cs); +void cs_detach_app(struct conn_stream *cs); /* * Initializes all required fields for a new conn_strema. diff --git a/src/conn_stream.c b/src/conn_stream.c index 0c7bf9b42..f0b06c65b 100644 --- a/src/conn_stream.c +++ b/src/conn_stream.c @@ -133,11 +133,27 @@ void cs_detach_endp(struct conn_stream *cs) appctx_free(appctx); } - /* Rest CS */ + /* FIXME: Rest CS for now but must be reviewed. CS flags are only + * connection related for now but this will evolved + */ cs->flags = CS_FL_NONE; cs->end = NULL; cs->ctx = NULL; if (cs->si) cs->si->ops = &si_embedded_ops; cs->data_cb = NULL; + + if (cs->app == NULL) + cs_free(cs); +} + +void cs_detach_app(struct conn_stream *cs) +{ + si_free(cs->si); + cs->app = NULL; + cs->si = NULL; + cs->data_cb = NULL; + + if (cs->end == NULL) + cs_free(cs); }