diff --git a/src/peers.c b/src/peers.c index a5dff87e6..af413c69a 100644 --- a/src/peers.c +++ b/src/peers.c @@ -1237,9 +1237,6 @@ static struct session *peer_session_create(struct peer *peer, struct peer_sessio if ((s->req = pool_alloc2(pool2_channel)) == NULL) goto out_fail_req; /* no memory */ - if (unlikely(b_alloc(&s->req->buf) == NULL)) - goto out_fail_req_buf; /* no memory */ - channel_init(s->req); s->req->prod = &s->si[0]; s->req->cons = &s->si[1]; @@ -1259,12 +1256,12 @@ static struct session *peer_session_create(struct peer *peer, struct peer_sessio s->req->rto = s->fe->timeout.client; s->req->wto = s->be->timeout.server; + if (unlikely(b_alloc(&s->req->buf) == NULL)) + goto out_fail_req_buf; /* no memory */ + if ((s->rep = pool_alloc2(pool2_channel)) == NULL) goto out_fail_rep; /* no memory */ - if (unlikely(b_alloc(&s->rep->buf) == NULL)) - goto out_fail_rep_buf; /* no memory */ - channel_init(s->rep); s->rep->prod = &s->si[1]; s->rep->cons = &s->si[0]; @@ -1282,6 +1279,10 @@ static struct session *peer_session_create(struct peer *peer, struct peer_sessio t->expire = TICK_ETERNITY; s->rep->flags |= CF_READ_DONTWAIT; + + if (unlikely(b_alloc(&s->rep->buf) == NULL)) + goto out_fail_rep_buf; /* no memory */ + /* it is important not to call the wakeup function directly but to * pass through task_wakeup(), because this one knows how to apply * priorities to tasks. diff --git a/src/session.c b/src/session.c index 05fd72e56..6770ee484 100644 --- a/src/session.c +++ b/src/session.c @@ -477,15 +477,6 @@ int session_complete(struct session *s) if (unlikely((s->req = pool_alloc2(pool2_channel)) == NULL)) goto out_free_task; /* no memory */ - if (unlikely(b_alloc(&s->req->buf) == NULL)) - goto out_free_req; /* no memory */ - - if (unlikely((s->rep = pool_alloc2(pool2_channel)) == NULL)) - goto out_free_req_buf; /* no memory */ - - if (unlikely(b_alloc(&s->rep->buf) == NULL)) - goto out_free_rep; /* no memory */ - channel_init(s->req); s->req->prod = &s->si[0]; s->req->cons = &s->si[1]; @@ -501,6 +492,12 @@ int session_complete(struct session *s) s->req->wex = TICK_ETERNITY; s->req->analyse_exp = TICK_ETERNITY; + if (unlikely(b_alloc(&s->req->buf) == NULL)) + goto out_free_req; /* no memory */ + + if (unlikely((s->rep = pool_alloc2(pool2_channel)) == NULL)) + goto out_free_req_buf; /* no memory */ + channel_init(s->rep); s->rep->prod = &s->si[1]; s->rep->cons = &s->si[0]; @@ -518,6 +515,9 @@ int session_complete(struct session *s) s->rep->wex = TICK_ETERNITY; s->rep->analyse_exp = TICK_ETERNITY; + if (unlikely(b_alloc(&s->rep->buf) == NULL)) + goto out_free_rep; /* no memory */ + txn = &s->txn; /* Those variables will be checked and freed if non-NULL in * session.c:session_free(). It is important that they are