BUG/MEDIUM: connection: properly unregister the mux on failed initialization

When mux->init() fails, session_free() will call it again to unregister
it while it was already done, resulting in null derefs or use-after-free.
This typically happens on out-of-memory conditions during H1 or H2 connection
or stream allocation.

This fix must be backported to 1.9.
This commit is contained in:
Willy Tarreau 2019-01-10 10:33:32 +01:00
parent ada5d09142
commit 762475e1f9

View File

@ -832,9 +832,16 @@ static inline struct wait_event *wl_set_waitcb(struct wait_event *wl, struct tas
static inline int conn_install_mux(struct connection *conn, const struct mux_ops *mux,
void *ctx, struct proxy *prx, struct session *sess)
{
int ret;
conn->mux = mux;
conn->ctx = ctx;
return mux->init ? mux->init(conn, prx, sess) : 0;
ret = mux->init ? mux->init(conn, prx, sess) : 0;
if (ret < 0) {
conn->mux = NULL;
conn->ctx = NULL;
}
return ret;
}
/* returns a human-readable error code for conn->err_code, or NULL if the code