diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c index c96f7519..619b0087 100644 --- a/lib/libwebsockets.c +++ b/lib/libwebsockets.c @@ -1382,8 +1382,7 @@ _libwebsocket_rx_flow_control(struct libwebsocket *wsi) if ((wsi->u.ws.rxflow_change_to & 1) && wsi->u.ws.rxflow_buffer) { n = libwebsocket_interpret_incoming_packet(wsi, NULL, 0); if (n < 0) { - lwsl_info("closing connection at libwebsocket_rx_flow_control:\n"); - libwebsocket_close_and_free_session(context, wsi, LWS_CLOSE_STATUS_NOSTATUS); + lwsl_info("returning that we want to close connection at libwebsocket_rx_flow_control:\n"); return -1; } if (n) @@ -1495,15 +1494,10 @@ int user_callback_handle_rxflow(callback_function callback_function, int n; n = callback_function(context, wsi, reason, user, in, len); - if (n) { - libwebsocket_close_and_free_session(context, wsi, - LWS_CLOSE_STATUS_NOSTATUS); - return n; - } + if (!n) + n = _libwebsocket_rx_flow_control(wsi); - _libwebsocket_rx_flow_control(wsi); - - return 0; + return n; } diff --git a/lib/output.c b/lib/output.c index 8e13d4b4..55726f32 100644 --- a/lib/output.c +++ b/lib/output.c @@ -501,8 +501,7 @@ int libwebsockets_serve_http_file_fragment(struct libwebsocket_context *context, if (wsi->protocol->callback) ret = user_callback_handle_rxflow(wsi->protocol->callback, context, wsi, LWS_CALLBACK_HTTP_FILE_COMPLETION, wsi->user_space, NULL, 0); - /* user_callback_handle_rxflow did any close already */ - return 0; + return ret; } } diff --git a/lib/parsers.c b/lib/parsers.c index a320fef9..438f1032 100644 --- a/lib/parsers.c +++ b/lib/parsers.c @@ -546,6 +546,7 @@ libwebsocket_rx_sm(struct libwebsocket *wsi, unsigned char c) { int n; struct lws_tokens eff_buf; + int ret = 0; #ifndef LWS_NO_EXTENSIONS int handled; int m; @@ -928,10 +929,10 @@ spill: } #endif if (eff_buf.token_len > 0) { - eff_buf.token[eff_buf.token_len] = '\0'; + eff_buf.token[eff_buf.token_len] = '\0'; - if (wsi->protocol->callback) - user_callback_handle_rxflow(wsi->protocol->callback, + if (wsi->protocol->callback) + ret = user_callback_handle_rxflow(wsi->protocol->callback, wsi->protocol->owning_server, wsi, LWS_CALLBACK_RECEIVE, wsi->user_space, @@ -945,7 +946,7 @@ spill: break; } - return 0; + return ret; illegal_ctl_length: