BUG/MEDIUM: mux_pt: Don't destroy the connection if we have a stream attached.

There's a small window where the mux_pt tasklet may be woken up, and thus
mux_pt_io_cb() get scheduled, and then the connection is attached to a new
stream. If this happen, don't do anything, and just let the stream know
by calling its wake method. If the connection had an error, the stream should
take care of destroying it by calling the detach method.

This should be backported to 2.0 and 1.9.
This commit is contained in:
Olivier Houchard 2019-10-18 13:56:40 +02:00
parent 9dce2c53a8
commit ea510fc5e7
1 changed files with 15 additions and 0 deletions

View File

@ -50,6 +50,21 @@ static struct task *mux_pt_io_cb(struct task *t, void *tctx, unsigned short stat
{
struct mux_pt_ctx *ctx = tctx;
if (ctx->cs) {
/* There's a small race condition.
* mux_pt_io_cb() is only supposed to be called if we have no
* stream attached. However, maybe the tasklet got woken up,
* and this connection was then attached to a new stream.
* If this happened, just call the wake method. It is probably
* not needed, because the stream probably subscribed to
* receive events, but that way we'll be sure the event got
* noticed, and if we had any error on the connection, we will
* let the stream call the detach method to destroy it.
*/
if (ctx->cs->data_cb->wake)
ctx->cs->data_cb->wake(ctx->cs);
return NULL;
}
conn_sock_drain(ctx->conn);
if (ctx->conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH))
mux_pt_destroy(ctx);