diff --git a/lib/client-handshake.c b/lib/client-handshake.c index 76d4ce75..e8e497e2 100644 --- a/lib/client-handshake.c +++ b/lib/client-handshake.c @@ -89,7 +89,7 @@ struct libwebsocket *__libwebsocket_client_connect_2( if (n < 0) { compatible_close(wsi->sock); lwsl_debug("ERROR writing to proxy socket\n"); - goto bail1; + goto oom4; } libwebsocket_set_timeout(wsi, @@ -130,7 +130,6 @@ struct libwebsocket *__libwebsocket_client_connect_2( oom4: free(wsi->u.hdr.ah); -bail1: free(wsi); return NULL; @@ -183,7 +182,7 @@ libwebsocket_client_connect(struct libwebsocket_context *context, wsi = (struct libwebsocket *) malloc(sizeof(struct libwebsocket)); if (wsi == NULL) - goto bail1; + goto bail; memset(wsi, 0, sizeof(*wsi)); diff --git a/lib/parsers.c b/lib/parsers.c index 2d6aa3ca..4202d3a3 100644 --- a/lib/parsers.c +++ b/lib/parsers.c @@ -598,6 +598,7 @@ set_parsing_complete: lwsl_parser("v%02d hdrs completed\n", wsi->ietf_spec_revision); } wsi->u.hdr.parser_state = WSI_PARSING_COMPLETE; + wsi->hdr_parsing_completed = 1; return 0; } diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index d1699089..d93621db 100644 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -372,6 +372,8 @@ struct libwebsocket { char lws_rx_parse_state; /* enum lws_rx_parse_state */ char rx_frame_type; /* enum libwebsocket_write_protocol */ + unsigned int hdr_parsing_completed:1; + char pending_timeout; /* enum pending_timeout */ unsigned long pending_timeout_limit; diff --git a/lib/server.c b/lib/server.c index e0f46c39..1b10a86a 100644 --- a/lib/server.c +++ b/lib/server.c @@ -102,6 +102,7 @@ libwebsocket_create_new_server_wsi(struct libwebsocket_context *context) new_wsi->state = WSI_STATE_HTTP; new_wsi->u.hdr.name_buffer_pos = 0; new_wsi->mode = LWS_CONNMODE_HTTP_SERVING; + new_wsi->hdr_parsing_completed = 0; if (lws_allocate_header_table(new_wsi)) { free(new_wsi); @@ -167,7 +168,10 @@ int lws_server_socket_service(struct libwebsocket_context *context, return 0; } if (!len) { - lwsl_info("lws_server_sktt_srv: read 0 len\n"); + lwsl_info("lws_server_skt_srv: read 0 len\n"); + /* lwsl_info(" state=%d\n", wsi->state); */ + if (!wsi->hdr_parsing_completed) + free(wsi->u.hdr.ah); libwebsocket_close_and_free_session( context, wsi, LWS_CLOSE_STATUS_NOSTATUS); return 0;