Project homepage Mailing List  Warmcat.com  API Docs  Github Mirror 
{"schema":"libjg2-1", "vpath":"/git/", "avatar":"/git/avatar/", "alang":"", "gen_ut":1752657180, "reponame":"libwebsockets", "desc":"libwebsockets lightweight C networking library", "owner": { "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" },"url":"https://libwebsockets.org/repo/libwebsockets", "f":3, "items": [ {"schema":"libjg2-1", "cid":"fac1fac3090175c42d1dd3657acffeb7", "commit": {"type":"commit", "time": 1504264187, "time_ofs": 480, "oid_tree": { "oid": "c89f9b46eab679c548b280b3c4ce6473fadb9c5a", "alias": []}, "oid":{ "oid": "32eaf83f24ec4b355add6fa8ffbcc0ef5884f7d1", "alias": []}, "msg": "socks5: style and exit handling", "sig_commit": { "git_time": { "time": 1504264187, "offset": 480 }, "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" }, "sig_author": { "git_time": { "time": 1504264187, "offset": 480 }, "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" }}, "body": "socks5: style and exit handling" , "diff": "diff --git a/lib/client-handshake.c b/lib/client-handshake.c\nindex ae4bcdc..cfb1f39 100644\n--- a/lib/client-handshake.c\n+++ b/lib/client-handshake.c\n@@ -87,8 +87,7 @@ lws_client_connect_2(struct lws *wsi)\n \n \t} else if (wsi-\u003evhost-\u003esocks_proxy_port) {\n \t\tsocks_generate_msg(wsi, SOCKS_MSG_GREETING, \u0026plen);\n-\t\tlwsl_client(\u0022%s\u005cn\u0022, \u0022Sending SOCKS Greeting.\u0022);\n-\n+\t\tlwsl_client(\u0022Sending SOCKS Greeting\u005cn\u0022);\n \t\tads \u003d wsi-\u003evhost-\u003esocks_proxy_address;\n \t\tport \u003d wsi-\u003evhost-\u003esocks_proxy_port;\n #endif\n@@ -366,8 +365,7 @@ lws_client_connect_2(struct lws *wsi)\n \t\tn \u003d send(wsi-\u003edesc.sockfd, (char *)pt-\u003eserv_buf, plen,\n \t\t\t MSG_NOSIGNAL);\n \t\tif (n \u003c 0) {\n-\t\t\tlwsl_debug(\u0022ERROR writing greeting to socks proxy\u0022\n-\t\t\t\t\u0022socket.\u005cn\u0022);\n+\t\t\tlwsl_debug(\u0022ERROR writing socks greeting\u005cn\u0022);\n \t\t\tcce \u003d \u0022socks write failed\u0022;\n \t\t\tgoto failed;\n \t\t}\n@@ -980,9 +978,12 @@ void socks_generate_msg(struct lws *wsi, enum socks_msg_type type,\n {\n \tstruct lws_context *context \u003d wsi-\u003econtext;\n \tstruct lws_context_per_thread *pt \u003d \u0026context-\u003ept[(int)wsi-\u003etsi];\n-\tssize_t len \u003d 0;\n+\tssize_t len \u003d 0, n, passwd_len;\n+\tshort net_num;\n+\tchar *p;\n \n-\tif (type \u003d\u003d SOCKS_MSG_GREETING) {\n+\tswitch (type) {\n+\tcase SOCKS_MSG_GREETING:\n \t\t/* socks version, version 5 only */\n \t\tpt-\u003eserv_buf[len++] \u003d SOCKS_VERSION_5;\n \t\t/* number of methods */\n@@ -991,33 +992,30 @@ void socks_generate_msg(struct lws *wsi, enum socks_msg_type type,\n \t\tpt-\u003eserv_buf[len++] \u003d SOCKS_AUTH_USERNAME_PASSWORD;\n \t\t/* no authentication method */\n \t\tpt-\u003eserv_buf[len++] \u003d SOCKS_AUTH_NO_AUTH;\n-\t}\n-\telse if (type \u003d\u003d SOCKS_MSG_USERNAME_PASSWORD) {\n-\t\tssize_t user_len \u003d 0;\n-\t\tssize_t passwd_len \u003d 0;\n+\t\tbreak;\n \n-\t\tuser_len \u003d strlen(wsi-\u003evhost-\u003esocks_user);\n+\tcase SOCKS_MSG_USERNAME_PASSWORD:\n+\t\tn \u003d strlen(wsi-\u003evhost-\u003esocks_user);\n \t\tpasswd_len \u003d strlen(wsi-\u003evhost-\u003esocks_password);\n \n \t\t/* the subnegotiation version */\n \t\tpt-\u003eserv_buf[len++] \u003d SOCKS_SUBNEGOTIATION_VERSION_1;\n \t\t/* length of the user name */\n-\t\tpt-\u003eserv_buf[len++] \u003d user_len;\n+\t\tpt-\u003eserv_buf[len++] \u003d n;\n \t\t/* user name */\n \t\tstrncpy((char *)\u0026pt-\u003eserv_buf[len], wsi-\u003evhost-\u003esocks_user,\n \t\t\tcontext-\u003ept_serv_buf_size - len);\n-\t\tlen +\u003d user_len;\n+\t\tlen +\u003d n;\n \t\t/* length of the password */\n \t\tpt-\u003eserv_buf[len++] \u003d passwd_len;\n \t\t/* password */\n \t\tstrncpy((char *)\u0026pt-\u003eserv_buf[len], wsi-\u003evhost-\u003esocks_password,\n \t\t\tcontext-\u003ept_serv_buf_size - len);\n \t\tlen +\u003d passwd_len;\n-\t}\n-\telse if (type \u003d\u003d SOCKS_MSG_CONNECT) {\n-\t\tssize_t len_index \u003d 0;\n-\t\tshort net_num \u003d 0;\n-\t\tchar *net_buf \u003d (char*)\u0026net_num;\n+\t\tbreak;\n+\n+\tcase SOCKS_MSG_CONNECT:\n+\t\tp \u003d (char*)\u0026net_num;\n \n \t\t/* socks version */\n \t\tpt-\u003eserv_buf[len++] \u003d SOCKS_VERSION_5;\n@@ -1027,20 +1025,25 @@ void socks_generate_msg(struct lws *wsi, enum socks_msg_type type,\n \t\tpt-\u003eserv_buf[len++] \u003d 0;\n \t\t/* address type */\n \t\tpt-\u003eserv_buf[len++] \u003d SOCKS_ATYP_DOMAINNAME;\n-\t\tlen_index \u003d len++;\n+\t\t/* skip length, we fill it in at the end */\n+\t\tn \u003d len++;\n \n \t\t/* the address we tell SOCKS proxy to connect to */\n \t\tstrncpy((char *)\u0026(pt-\u003eserv_buf[len]), wsi-\u003eu.hdr.stash-\u003eaddress,\n \t\t\tcontext-\u003ept_serv_buf_size - len);\n \t\tlen +\u003d strlen(wsi-\u003eu.hdr.stash-\u003eaddress);\n-\t\tnet_num \u003d htons((short)wsi-\u003ec_port);\n+\t\tnet_num \u003d htons(wsi-\u003ec_port);\n \n \t\t/* the port we tell SOCKS proxy to connect to */\n-\t\tpt-\u003eserv_buf[len++] \u003d net_buf[0];\n-\t\tpt-\u003eserv_buf[len++] \u003d net_buf[1];\n+\t\tpt-\u003eserv_buf[len++] \u003d p[0];\n+\t\tpt-\u003eserv_buf[len++] \u003d p[1];\n \n \t\t/* the length of the address, excluding port */\n-\t\tpt-\u003eserv_buf[len_index] \u003d strlen(wsi-\u003eu.hdr.stash-\u003eaddress);\n+\t\tpt-\u003eserv_buf[n] \u003d strlen(wsi-\u003eu.hdr.stash-\u003eaddress);\n+\t\tbreak;\n+\t\t\n+\tdefault:\n+\t\treturn;\n \t}\n \n \t*msg_len \u003d len;\ndiff --git a/lib/client.c b/lib/client.c\nindex 40ba4b3..f712271 100755\n--- a/lib/client.c\n+++ b/lib/client.c\n@@ -113,192 +113,98 @@ lws_client_socket_service(struct lws_context *context, struct lws *wsi,\n #if defined(LWS_WITH_SOCKS5)\n \t/* SOCKS Greeting Reply */\n \tcase LWSCM_WSCL_WAITING_SOCKS_GREETING_REPLY:\n+\tcase LWSCM_WSCL_WAITING_SOCKS_AUTH_REPLY:\n+\tcase LWSCM_WSCL_WAITING_SOCKS_CONNECT_REPLY:\n \n \t\t/* handle proxy hung up on us */\n \n \t\tif (pollfd-\u003erevents \u0026 LWS_POLLHUP) {\n-\n \t\t\tlwsl_warn(\u0022SOCKS connection %p (fd\u003d%d) dead\u005cn\u0022,\n \t\t\t\t (void *)wsi, pollfd-\u003efd);\n-\n-\t\t\tlws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);\n-\t\t\treturn 0;\n+\t\t\tgoto bail3;\n \t\t}\n \n \t\tn \u003d recv(wsi-\u003edesc.sockfd, sb, context-\u003ept_serv_buf_size, 0);\n \t\tif (n \u003c 0) {\n \t\t\tif (LWS_ERRNO \u003d\u003d LWS_EAGAIN) {\n-\t\t\t\tlwsl_debug(\u0022SOCKS read returned EAGAIN...\u0022\n-\t\t\t\t\t\u0022retrying\u005cn\u0022);\n+\t\t\t\tlwsl_debug(\u0022SOCKS read EAGAIN, retrying\u005cn\u0022);\n \t\t\t\treturn 0;\n \t\t\t}\n-\n-\t\t\tlws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);\n \t\t\tlwsl_err(\u0022ERROR reading from SOCKS socket\u005cn\u0022);\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\t/* processing greeting reply */\n-\t\tif (pt-\u003eserv_buf[0] \u003d\u003d SOCKS_VERSION_5\n-\t\t\t\u0026\u0026 pt-\u003eserv_buf[1] \u003d\u003d SOCKS_AUTH_NO_AUTH)\n-\t\t{\n-\t\t\tlwsl_client(\u0022%s\u005cn\u0022, \u0022SOCKS greeting reply received \u0022\n-\t\t\t\t\u0022- No Authentication Method\u0022);\n-\t\t\tsocks_generate_msg(wsi, SOCKS_MSG_CONNECT, \u0026len);\n-\n-\t\t\tconn_mode \u003d LWSCM_WSCL_WAITING_SOCKS_CONNECT_REPLY;\n-\t\t\tpending_timeout \u003d PENDING_TIMEOUT_AWAITING_SOCKS_CONNECT_REPLY;\n-\t\t\tlwsl_client(\u0022%s\u005cn\u0022, \u0022Sending SOCKS connect command\u0022);\n-\t\t}\n-\t\telse if (pt-\u003eserv_buf[0] \u003d\u003d SOCKS_VERSION_5\n-\t\t\t\t\u0026\u0026 pt-\u003eserv_buf[1] \u003d\u003d SOCKS_AUTH_USERNAME_PASSWORD)\n-\t\t{\n-\t\t\tlwsl_client(\u0022%s\u005cn\u0022, \u0022SOCKS greeting reply received \u0022\n-\t\t\t\t\u0022- User Name Password Method\u0022);\n-\t\t\tsocks_generate_msg(wsi, SOCKS_MSG_USERNAME_PASSWORD,\n-\t\t\t\t\t \u0026len);\n-\n-\t\t\tconn_mode \u003d LWSCM_WSCL_WAITING_SOCKS_AUTH_REPLY;\n-\t\t\tpending_timeout \u003d PENDING_TIMEOUT_AWAITING_SOCKS_AUTH_REPLY;\n-\t\t\tlwsl_client(\u0022%s\u005cn\u0022, \u0022Sending SOCKS user/password\u0022);\n-\t\t}\n-\t\telse\n-\t\t{\n-\t\t\tlws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);\n-\t\t\tlwsl_err(\u0022ERROR SOCKS greeting reply failed, method \u0022\n-\t\t\t\t\u0022code: %d\u005cn\u0022, pt-\u003eserv_buf[1]);\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tn \u003d send(wsi-\u003edesc.sockfd, (char *)pt-\u003eserv_buf, len,\n-\t\t\t MSG_NOSIGNAL);\n-\t\tif (n \u003c 0) {\n-\t\t\tlwsl_debug(\u0022ERROR writing socks command to socks proxy \u0022\n-\t\t\t\t\u0022socket\u005cn\u0022);\n-\t\t\treturn 0;\n+\t\t\tgoto bail3;\n \t\t}\n \n-\t\tlws_set_timeout(wsi, pending_timeout, AWAITING_TIMEOUT);\n-\t\twsi-\u003emode \u003d conn_mode;\n+\t\tswitch (wsi-\u003emode) {\n \n-\t\tbreak;\n-\t/* SOCKS auth Reply */\n-\tcase LWSCM_WSCL_WAITING_SOCKS_AUTH_REPLY:\n-\n-\t\t/* handle proxy hung up on us */\n+\t\tcase LWSCM_WSCL_WAITING_SOCKS_GREETING_REPLY:\n+\t\t\tif (pt-\u003eserv_buf[0] !\u003d SOCKS_VERSION_5)\n+\t\t\t\tgoto socks_reply_fail;\n \n-\t\tif (pollfd-\u003erevents \u0026 LWS_POLLHUP) {\n-\n-\t\t\tlwsl_warn(\u0022SOCKS connection %p (fd\u003d%d) dead\u005cn\u0022,\n-\t\t\t\t (void *)wsi, pollfd-\u003efd);\n-\n-\t\t\tlws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);\n-\t\t\treturn 0;\n-\t\t}\n+\t\t\tif (pt-\u003eserv_buf[1] \u003d\u003d SOCKS_AUTH_NO_AUTH) {\n+\t\t\t\tlwsl_client(\u0022SOCKS greeting reply: No Auth Method\u005cn\u0022);\n+\t\t\t\tsocks_generate_msg(wsi, SOCKS_MSG_CONNECT, \u0026len);\n+\t\t\t\tconn_mode \u003d LWSCM_WSCL_WAITING_SOCKS_CONNECT_REPLY;\n+\t\t\t\tpending_timeout \u003d PENDING_TIMEOUT_AWAITING_SOCKS_CONNECT_REPLY;\n+\t\t\t\tgoto socks_send;\n+\t\t\t}\n \n-\t\tn \u003d recv(wsi-\u003edesc.sockfd, sb, context-\u003ept_serv_buf_size, 0);\n-\t\tif (n \u003c 0) {\n-\t\t\tif (LWS_ERRNO \u003d\u003d LWS_EAGAIN) {\n-\t\t\t\tlwsl_debug(\u0022SOCKS read returned EAGAIN... \u0022\n-\t\t\t\t\t\u0022retrying\u005cn\u0022);\n-\t\t\t\treturn 0;\n+\t\t\tif (pt-\u003eserv_buf[1] \u003d\u003d SOCKS_AUTH_USERNAME_PASSWORD) {\n+\t\t\t\tlwsl_client(\u0022SOCKS greeting reply: User/Pw Method\u005cn\u0022);\n+\t\t\t\tsocks_generate_msg(wsi, SOCKS_MSG_USERNAME_PASSWORD, \u0026len);\n+\t\t\t\tconn_mode \u003d LWSCM_WSCL_WAITING_SOCKS_AUTH_REPLY;\n+\t\t\t\tpending_timeout \u003d PENDING_TIMEOUT_AWAITING_SOCKS_AUTH_REPLY;\n+\t\t\t\tgoto socks_send;\n \t\t\t}\n+\t\t\tgoto socks_reply_fail;\n \n-\t\t\tlws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);\n-\t\t\tlwsl_err(\u0022ERROR reading from socks socket\u005cn\u0022);\n-\t\t\treturn 0;\n-\t\t}\n+\t\tcase LWSCM_WSCL_WAITING_SOCKS_AUTH_REPLY:\n+\t\t\tif (pt-\u003eserv_buf[0] !\u003d SOCKS_SUBNEGOTIATION_VERSION_1 ||\n+\t\t\t pt-\u003eserv_buf[1] !\u003d SOCKS_SUBNEGOTIATION_STATUS_SUCCESS)\n+\t\t\t\tgoto socks_reply_fail;\n \n-\t\t/* processing auth reply */\n-\t\tif (pt-\u003eserv_buf[0] \u003d\u003d SOCKS_SUBNEGOTIATION_VERSION_1\n-\t\t\t\u0026\u0026 pt-\u003eserv_buf[1] \u003d\u003d SOCKS_SUBNEGOTIATION_STATUS_SUCCESS)\n-\t\t{\n-\t\t\tlwsl_client(\u0022%s\u005cn\u0022, \u0022SOCKS password reply recieved - \u0022\n-\t\t\t\t\u0022successful\u0022);\n+\t\t\tlwsl_client(\u0022SOCKS password OK, sending connect\u005cn\u0022);\n \t\t\tsocks_generate_msg(wsi, SOCKS_MSG_CONNECT, \u0026len);\n-\n \t\t\tconn_mode \u003d LWSCM_WSCL_WAITING_SOCKS_CONNECT_REPLY;\n-\t\t\tpending_timeout \u003d\n-\t\t\t\tPENDING_TIMEOUT_AWAITING_SOCKS_CONNECT_REPLY;\n-\t\t\tlwsl_client(\u0022%s\u005cn\u0022, \u0022Sending SOCKS connect command\u0022);\n-\t\t}\n-\t\telse\n-\t\t{\n-\t\t\tlws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);\n-\t\t\tlwsl_err(\u0022ERROR : SOCKS user/password reply failed, \u0022\n-\t\t\t\t\u0022error code: %d\u005cn\u0022, pt-\u003eserv_buf[1]);\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tn \u003d send(wsi-\u003edesc.sockfd, (char *)pt-\u003eserv_buf, len,\n-\t\t\t MSG_NOSIGNAL);\n-\t\tif (n \u003c 0) {\n-\t\t\tlwsl_debug(\u0022ERROR writing connect command to SOCKS \u0022\n-\t\t\t\t\u0022socket\u005cn\u0022);\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tlws_set_timeout(wsi, pending_timeout, AWAITING_TIMEOUT);\n-\t\twsi-\u003emode \u003d conn_mode;\n-\n-\t\tbreak;\n-\n-\t/* SOCKS connect command Reply */\n-\tcase LWSCM_WSCL_WAITING_SOCKS_CONNECT_REPLY:\n-\n-\t\t/* handle proxy hung up on us */\n-\n-\t\tif (pollfd-\u003erevents \u0026 LWS_POLLHUP) {\n-\n-\t\t\tlwsl_warn(\u0022SOCKS connection %p (fd\u003d%d) dead\u005cn\u0022,\n-\t\t\t\t (void *)wsi, pollfd-\u003efd);\n-\n-\t\t\tlws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);\n-\t\t\treturn 0;\n-\t\t}\n-\n-\t\tn \u003d recv(wsi-\u003edesc.sockfd, sb, context-\u003ept_serv_buf_size, 0);\n-\t\tif (n \u003c 0) {\n-\t\t\tif (LWS_ERRNO \u003d\u003d LWS_EAGAIN) {\n-\t\t\t\tlwsl_debug(\u0022SOCKS read returned EAGAIN... \u0022\n-\t\t\t\t\t\u0022retrying\u005cn\u0022);\n-\t\t\t\treturn 0;\n+\t\t\tpending_timeout \u003d PENDING_TIMEOUT_AWAITING_SOCKS_CONNECT_REPLY;\n+socks_send:\n+\t\t\tn \u003d send(wsi-\u003edesc.sockfd, (char *)pt-\u003eserv_buf, len,\n+\t\t\t\t MSG_NOSIGNAL);\n+\t\t\tif (n \u003c 0) {\n+\t\t\t\tlwsl_debug(\u0022ERROR writing to socks proxy\u005cn\u0022);\n+\t\t\t\tgoto bail3;\n \t\t\t}\n \n-\t\t\tlws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);\n-\t\t\tlwsl_err(\u0022ERROR reading from socks socket\u005cn\u0022);\n-\t\t\treturn 0;\n-\t\t}\n+\t\t\tlws_set_timeout(wsi, pending_timeout, AWAITING_TIMEOUT);\n+\t\t\twsi-\u003emode \u003d conn_mode;\n+\t\t\tbreak;\n \n-\t\t/* processing connect reply */\n-\t\tif (pt-\u003eserv_buf[0] \u003d\u003d SOCKS_VERSION_5\n-\t\t\t\u0026\u0026 pt-\u003eserv_buf[1] \u003d\u003d SOCKS_REQUEST_REPLY_SUCCESS)\n-\t\t{\n-\t\t\tlwsl_client(\u0022%s\u005cn\u0022, \u0022SOCKS connect reply recieved - \u0022\n-\t\t\t\t\u0022successful\u0022);\n-\t\t}\n-\t\telse\n-\t\t{\n-\t\t\tlws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);\n-\t\t\tlwsl_err(\u0022ERROR SOCKS connect reply failed, error \u0022\n-\t\t\t\t\u0022code: %d\u005cn\u0022, pt-\u003eserv_buf[1]);\n-\t\t\treturn 0;\n-\t\t}\n+socks_reply_fail:\n+\t\t\tlwsl_notice(\u0022socks reply: v%d, err %d\u005cn\u0022,\n+\t\t\t\t pt-\u003eserv_buf[0], pt-\u003eserv_buf[1]);\n+\t\t\tgoto bail3;\n \n-\t\t/* free stash since we are done with it */\n-\t\tlws_free_set_NULL(wsi-\u003eu.hdr.stash);\n+\t\tcase LWSCM_WSCL_WAITING_SOCKS_CONNECT_REPLY:\n+\t\t\tif (pt-\u003eserv_buf[0] !\u003d SOCKS_VERSION_5 ||\n+\t\t\t pt-\u003eserv_buf[1] !\u003d SOCKS_REQUEST_REPLY_SUCCESS)\n+\t\t\t\tgoto socks_reply_fail;\n \n-\t\tif (lws_hdr_simple_create(wsi, _WSI_TOKEN_CLIENT_PEER_ADDRESS,\n-\t\t\twsi-\u003evhost-\u003esocks_proxy_address))\n-\t\t\tgoto bail3;\n-\t\twsi-\u003ec_port \u003d wsi-\u003evhost-\u003esocks_proxy_port;\n+\t\t\tlwsl_client(\u0022socks connect OK\u005cn\u0022);\n \n-\t\t/* clear his proxy connection timeout */\n+\t\t\t/* free stash since we are done with it */\n+\t\t\tlws_free_set_NULL(wsi-\u003eu.hdr.stash);\n+\t\t\tif (lws_hdr_simple_create(wsi, _WSI_TOKEN_CLIENT_PEER_ADDRESS,\n+\t\t\t\t\t\t wsi-\u003evhost-\u003esocks_proxy_address))\n+\t\t\t\tgoto bail3;\n \n-\t\tlws_set_timeout(wsi, NO_PENDING_TIMEOUT, 0);\n+\t\t\twsi-\u003ec_port \u003d wsi-\u003evhost-\u003esocks_proxy_port;\n \n-\t\tgoto start_ws_hanshake;\n+\t\t\t/* clear his proxy connection timeout */\n+\t\t\tlws_set_timeout(wsi, NO_PENDING_TIMEOUT, 0);\n+\t\t\tgoto start_ws_handshake;\n+\t\t}\n+\t\tbreak;\n #endif\n+\n \tcase LWSCM_WSCL_WAITING_PROXY_REPLY:\n \n \t\t/* handle proxy hung up on us */\n@@ -308,8 +214,7 @@ lws_client_socket_service(struct lws_context *context, struct lws *wsi,\n \t\t\tlwsl_warn(\u0022Proxy connection %p (fd\u003d%d) dead\u005cn\u0022,\n \t\t\t\t (void *)wsi, pollfd-\u003efd);\n \n-\t\t\tlws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);\n-\t\t\treturn 0;\n+\t\t\tgoto bail3;\n \t\t}\n \n \t\tn \u003d recv(wsi-\u003edesc.sockfd, sb, context-\u003ept_serv_buf_size, 0);\n@@ -318,18 +223,15 @@ lws_client_socket_service(struct lws_context *context, struct lws *wsi,\n \t\t\t\tlwsl_debug(\u0022Proxy read returned EAGAIN... retrying\u005cn\u0022);\n \t\t\t\treturn 0;\n \t\t\t}\n-\n-\t\t\tlws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);\n \t\t\tlwsl_err(\u0022ERROR reading from proxy socket\u005cn\u0022);\n-\t\t\treturn 0;\n+\t\t\tgoto bail3;\n \t\t}\n \n \t\tpt-\u003eserv_buf[13] \u003d '\u005c0';\n \t\tif (strcmp(sb, \u0022HTTP/1.0 200 \u0022) \u0026\u0026\n \t\t strcmp(sb, \u0022HTTP/1.1 200 \u0022)) {\n-\t\t\tlws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);\n \t\t\tlwsl_err(\u0022ERROR proxy: %s\u005cn\u0022, sb);\n-\t\t\treturn 0;\n+\t\t\tgoto bail3;\n \t\t}\n \n \t\t/* clear his proxy connection timeout */\n@@ -348,7 +250,7 @@ lws_client_socket_service(struct lws_context *context, struct lws *wsi,\n \t\t * happening at a time when there's no real connection yet\n \t\t */\n #if defined(LWS_WITH_SOCKS5)\n-start_ws_hanshake:\n+start_ws_handshake:\n #endif\n \t\tif (lws_change_pollfd(wsi, LWS_POLLOUT, 0))\n \t\t\treturn -1;\n","s":{"c":1752657180,"u": 2948}} ],"g": 4916,"chitpc": 0,"ehitpc": 0,"indexed":0 , "ab": 0, "si": 0, "db":0, "di":0, "sat":0, "lfc": "0000"}