diff --git a/lib/server/parsers.c b/lib/server/parsers.c index 2ae188c83..b75740c6f 100644 --- a/lib/server/parsers.c +++ b/lib/server/parsers.c @@ -1504,14 +1504,12 @@ handle_first: * if there's no protocol max frame size given, we are * supposed to default to context->pt_serv_buf_size */ - if (!wsi->protocol->rx_buffer_size && wsi->u.ws.rx_ubuf_head != wsi->context->pt_serv_buf_size) break; - else - if (wsi->protocol->rx_buffer_size && - wsi->u.ws.rx_ubuf_head != - wsi->protocol->rx_buffer_size) + + if (wsi->protocol->rx_buffer_size && + wsi->u.ws.rx_ubuf_head != wsi->protocol->rx_buffer_size) break; /* spill because we filled our rx buffer */ diff --git a/lib/server/server.c b/lib/server/server.c index 1b0def6e5..bb8d64efe 100644 --- a/lib/server/server.c +++ b/lib/server/server.c @@ -2867,18 +2867,31 @@ lws_interpret_incoming_packet(struct lws *wsi, unsigned char **buf, size_t len) /* account for what we're using in rxflow buffer */ if (wsi->rxflow_buffer) { wsi->rxflow_pos++; - assert(wsi->rxflow_pos <= wsi->rxflow_len); + if (wsi->rxflow_pos > wsi->rxflow_len) { + lwsl_err("bumped rxflow buffer too far (%d / %d)", wsi->rxflow_pos, wsi->rxflow_len); + assert(0); + } } /* consume payload bytes efficiently */ - if ( - wsi->lws_rx_parse_state == + if (wsi->lws_rx_parse_state == LWS_RXPS_PAYLOAD_UNTIL_LENGTH_EXHAUSTED) { m = lws_payload_until_length_exhausted(wsi, buf, &len); if (wsi->rxflow_buffer) wsi->rxflow_pos += m; } + if (wsi->rxflow_buffer && wsi->rxflow_pos == wsi->rxflow_len) { + lwsl_debug("%s: %p flow buf: drained\n", __func__, wsi); + lws_free_set_NULL(wsi->rxflow_buffer); + /* having drained the rxflow buffer, can rearm POLLIN */ +#ifdef LWS_NO_SERVER + m = +#endif + _lws_rx_flow_control(wsi); + /* m ignored, needed for NO_SERVER case */ + } + /* process the byte */ m = lws_rx_sm(wsi, *(*buf)++); if (m < 0)