mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-01-14 17:50:48 +00:00
BUG/MEDIUM: stream: Make sure to unsubscribe before si_release_endpoint.
Make sure we unsubscribe from events before si_release_endpoint destroys the conn_stream, or it will be never called. To do so, move the call to unsubscribe to si_release_endpoint() directly. This is 1.9-specific and shouldn't be backported.
This commit is contained in:
parent
c8c0ed91cb
commit
4fdec7aafa
@ -169,8 +169,12 @@ static inline void si_release_endpoint(struct stream_interface *si)
|
||||
if (!si->end)
|
||||
return;
|
||||
|
||||
if ((cs = objt_cs(si->end)))
|
||||
if ((cs = objt_cs(si->end))) {
|
||||
if (si->wait_event.wait_reason != 0)
|
||||
cs->conn->mux->unsubscribe(cs, si->wait_event.wait_reason,
|
||||
&si->wait_event);
|
||||
cs_destroy(cs);
|
||||
}
|
||||
else if ((appctx = objt_appctx(si->end))) {
|
||||
if (appctx->applet->release && si->state < SI_ST_DIS)
|
||||
appctx->applet->release(appctx);
|
||||
|
18
src/stream.c
18
src/stream.c
@ -400,27 +400,15 @@ static void stream_free(struct stream *s)
|
||||
/* applets do not release session yet */
|
||||
must_free_sess = objt_appctx(sess->origin) && sess->origin == s->si[0].end;
|
||||
|
||||
tasklet_free(s->si[0].wait_event.task);
|
||||
tasklet_free(s->si[1].wait_event.task);
|
||||
|
||||
si_release_endpoint(&s->si[1]);
|
||||
si_release_endpoint(&s->si[0]);
|
||||
|
||||
if (must_free_sess)
|
||||
session_free(sess);
|
||||
|
||||
tasklet_free(s->si[0].wait_event.task);
|
||||
if (s->si[0].wait_event.wait_reason != 0) {
|
||||
struct conn_stream *cs = objt_cs(s->si[0].end);
|
||||
if (cs)
|
||||
cs->conn->mux->unsubscribe(cs, s->si[0].wait_event.wait_reason,
|
||||
&s->si[0].wait_event);
|
||||
}
|
||||
tasklet_free(s->si[1].wait_event.task);
|
||||
if (s->si[1].wait_event.wait_reason != 0) {
|
||||
struct conn_stream *cs = objt_cs(s->si[1].end);
|
||||
if (cs)
|
||||
cs->conn->mux->unsubscribe(cs, s->si[1].wait_event.wait_reason,
|
||||
&s->si[1].wait_event);
|
||||
}
|
||||
|
||||
pool_free(pool_head_stream, s);
|
||||
|
||||
/* We may want to free the maximum amount of pools if the proxy is stopping */
|
||||
|
Loading…
Reference in New Issue
Block a user