From: Olivier Houchard Date: Fri, 10 May 2019 12:02:21 +0000 (+0200) Subject: BUG/MEDIUM: h2: Don't check send_wait to know if we're in the send_list. X-Git-Tag: v2.0-dev3~56 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bfe2a83c244cc11e921216d177db1d0f523c948f;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: h2: Don't check send_wait to know if we're in the send_list. When we have to stop sending due to the stream flow control, don't check if send_wait is NULL to know if we're in the send_list, because at this point it'll always be NULL, while we're probably in the list. Use LIST_ISEMPTY(&h2s->list) instead. Failing to do so mean we might be added in the send_list when flow control allows us to emit again, while we're already in it. While I'm here, replace LIST_DEL + LIST_INIT by LIST_DEL_INIT. This should be backported to 1.9. --- diff --git a/src/mux_h2.c b/src/mux_h2.c index 6a8a762a25..d1fa25a5d7 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -4160,10 +4160,8 @@ static size_t h2s_frt_make_resp_data(struct h2s *h2s, const struct buffer *buf, if (size <= 0) { h2s->flags |= H2_SF_BLK_SFCTL; - if (h2s->send_wait) { - LIST_DEL(&h2s->list); - LIST_INIT(&h2s->list); - } + if (!LIST_ISEMPTY(&h2s->list)) + LIST_DEL_INIT(&h2s->list); goto end; } @@ -4907,10 +4905,8 @@ static size_t h2s_htx_frt_make_resp_data(struct h2s *h2s, struct buffer *buf, si if (h2s->mws <= 0) { h2s->flags |= H2_SF_BLK_SFCTL; - if (h2s->send_wait) { - LIST_DEL(&h2s->list); - LIST_INIT(&h2s->list); - } + if (!LIST_ISEMPTY(&h2s->list)) + LIST_DEL_INIT(&h2s->list); goto end; }