From b84f3e5014604f7a12affaff1dbf21ecf13348d1 Mon Sep 17 00:00:00 2001 From: Diana Ren <diren@microsoft.com> Date: Tue, 26 Mar 2019 11:48:06 -0700 Subject: [PATCH] Backport e02a999 into v2.4 with dependent changes included --- lib/client/client-handshake.c | 22 ++++++++++++++++++---- lib/private-libwebsockets.h | 3 +++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/lib/client/client-handshake.c b/lib/client/client-handshake.c index 829645f1..8ab11187 100644 --- a/lib/client/client-handshake.c +++ b/lib/client/client-handshake.c @@ -424,6 +424,7 @@ oom4: goto failed1; lws_remove_from_timeout_list(wsi); lws_header_table_detach(wsi, 0); + lws_client_stash_destroy(wsi); lws_free(wsi); return NULL; @@ -683,6 +684,15 @@ html_parser_cb(const hubbub_token *token, void *pw) } #endif +void +lws_client_stash_destroy(struct lws *wsi) +{ + if (!wsi || !wsi->u.hdr.stash) + return; + + lws_free_set_NULL(wsi->u.hdr.stash); +} + LWS_VISIBLE struct lws * lws_client_connect_via_info(struct lws_client_connect_info *i) { @@ -763,7 +773,7 @@ lws_client_connect_via_info(struct lws_client_connect_info *i) wsi->u.hdr.stash = lws_malloc(sizeof(*wsi->u.hdr.stash), "client stash"); if (!wsi->u.hdr.stash) { lwsl_err("%s: OOM\n", __func__); - goto bail; + goto bail1; } wsi->u.hdr.stash->origin[0] = '\0'; @@ -777,6 +787,7 @@ lws_client_connect_via_info(struct lws_client_connect_info *i) sizeof(wsi->u.hdr.stash->path) - 1); strncpy(wsi->u.hdr.stash->host, i->host, sizeof(wsi->u.hdr.stash->host) - 1); + if (i->origin) strncpy(wsi->u.hdr.stash->origin, i->origin, sizeof(wsi->u.hdr.stash->origin) - 1); @@ -810,7 +821,7 @@ lws_client_connect_via_info(struct lws_client_connect_info *i) * if we failed here, the connection is already closed * and freed. */ - goto bail1; + goto bail2; } if (i->parent_wsi) { @@ -829,10 +840,13 @@ lws_client_connect_via_info(struct lws_client_connect_info *i) return wsi; +bail1: + lws_client_stash_destroy(wsi); + bail: lws_free(wsi); -bail1: +bail2: if (i->pwsi) *i->pwsi = NULL; @@ -886,7 +900,7 @@ lws_client_connect_via_info2(struct lws *wsi) #if defined(LWS_WITH_SOCKS5) if (!wsi->vhost->socks_proxy_port) - lws_free_set_NULL(wsi->u.hdr.stash); + lws_client_stash_destroy(wsi); #endif /* diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h index ea7ce00e..6f7b4373 100644 --- a/lib/private-libwebsockets.h +++ b/lib/private-libwebsockets.h @@ -2113,6 +2113,9 @@ lws_handle_POLLOUT_event(struct lws *wsi, struct lws_pollfd *pollfd); LWS_EXTERN struct lws * lws_client_connect_via_info2(struct lws *wsi); +LWS_EXTERN void +lws_client_stash_destroy(struct lws *wsi); + LWS_EXTERN int _lws_destroy_ah(struct lws_context_per_thread *pt, struct allocated_headers *ah); -- GitLab