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.
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;
}
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;
}