From 83912f40e872798ff7659fa738174054a647a87e Mon Sep 17 00:00:00 2001 From: Andy Green Date: Sun, 16 Aug 2020 05:27:40 +0100 Subject: [PATCH] sspc: proxy: extend DESTROY_ME --- .../private-lib-secure-streams.h | 8 ++++++ lib/secure-streams/secure-streams-client.c | 15 +++++++++-- lib/secure-streams/secure-streams-process.c | 17 +++++++++--- lib/secure-streams/secure-streams-serialize.c | 26 ++++++++++++++----- 4 files changed, 55 insertions(+), 11 deletions(-) diff --git a/lib/secure-streams/private-lib-secure-streams.h b/lib/secure-streams/private-lib-secure-streams.h index eeef89731..f338fc6b8 100644 --- a/lib/secure-streams/private-lib-secure-streams.h +++ b/lib/secure-streams/private-lib-secure-streams.h @@ -333,6 +333,14 @@ struct policy_cb_args { extern const lws_ss_policy_t pol_smd; #endif + +/* + * returns one of + * + * LWSSSSRET_OK + * LWSSSSRET_DISCONNECT_ME + * LWSSSSRET_DESTROY_ME + */ int lws_ss_deserialize_parse(struct lws_ss_serialization_parser *par, struct lws_context *context, diff --git a/lib/secure-streams/secure-streams-client.c b/lib/secure-streams/secure-streams-client.c index 9e23850d6..f0adea82f 100644 --- a/lib/secure-streams/secure-streams-client.c +++ b/lib/secure-streams/secure-streams-client.c @@ -161,6 +161,9 @@ callback_sspc_client(struct lws *wsi, enum lws_callback_reasons reason, break; case LWS_CALLBACK_RAW_RX: + /* + * ie, the proxy has sent us something + */ lwsl_info("%s: RAW_RX: rx %d\n", __func__, (int)len); if (!h || !h->cwsi) { @@ -169,10 +172,18 @@ callback_sspc_client(struct lws *wsi, enum lws_callback_reasons reason, return -1; } - if (lws_ss_deserialize_parse(&h->parser, lws_get_context(wsi), + n = lws_ss_deserialize_parse(&h->parser, lws_get_context(wsi), h->dsh, in, len, &h->state, h, - (lws_ss_handle_t **)m, &h->ssi, 1)) + (lws_ss_handle_t **)m, &h->ssi, 1); + switch (n) { + case LWSSSSRET_OK: + break; + case LWSSSSRET_DISCONNECT_ME: return -1; + case LWSSSSRET_DESTROY_ME: + lws_sspc_destroy(&h); + return -1; + } if (wsi && (h->state == LPCSCLI_LOCAL_CONNECTED || h->state == LPCSCLI_ONWARD_CONNECT)) diff --git a/lib/secure-streams/secure-streams-process.c b/lib/secure-streams/secure-streams-process.c index 86a77af6b..f347a7a20 100644 --- a/lib/secure-streams/secure-streams-process.c +++ b/lib/secure-streams/secure-streams-process.c @@ -337,6 +337,9 @@ callback_ss_proxy(struct lws *wsi, enum lws_callback_reasons reason, break; case LWS_CALLBACK_RAW_RX: + /* + * ie, the proxy is receiving something from a client + */ lwsl_info("%s: RX: rx %d\n", __func__, (int)len); if (!conn || !conn->wsi) { @@ -357,11 +360,19 @@ callback_ss_proxy(struct lws *wsi, enum lws_callback_reasons reason, ssi.tx = ss_proxy_onward_tx; } ssi.state = ss_proxy_onward_state; + ssi.flags = 0; - if (lws_ss_deserialize_parse(&conn->parser, + n = lws_ss_deserialize_parse(&conn->parser, lws_get_context(wsi), conn->dsh, in, len, - &conn->state, conn, &conn->ss, &ssi, 0)) { - lwsl_err("%s: RAW_RX: deserialize_parse fail\n", __func__); + &conn->state, conn, &conn->ss, &ssi, 0); + switch (n) { + case LWSSSSRET_OK: + break; + case LWSSSSRET_DISCONNECT_ME: + return -1; + case LWSSSSRET_DESTROY_ME: + if (conn->ss) + lws_ss_destroy(&conn->ss); return -1; } diff --git a/lib/secure-streams/secure-streams-serialize.c b/lib/secure-streams/secure-streams-serialize.c index 71d3b7826..75c5ac79a 100644 --- a/lib/secure-streams/secure-streams-serialize.c +++ b/lib/secure-streams/secure-streams-serialize.c @@ -307,6 +307,12 @@ lws_ss_serialize_txcr(struct lws_dsh *dsh, int txcr) * handle * * proxy: pss is pointing to &conn->ss, a pointer to the ss handle + * + * Returns one of + * + * LWSSSSRET_OK + * LWSSSSRET_DISCONNECT_ME + * LWSSSSRET_DESTROY_ME */ /* convert userdata ptr _pss to handle pointer, allowing for any layout in @@ -636,7 +642,7 @@ payload_ff: lwsl_err("%s: unable to alloc in dsh 3\n", __func__); - return 1; + return LWSSSSRET_DISCONNECT_ME; } if (proxy_pss_to_ss_h(pss)) @@ -1130,20 +1136,28 @@ payload_ff: lwsl_info("%s: forwarding proxied state %s\n", __func__, lws_ss_state_name(par->ctr)); #endif - if (ssi->state(client_pss_to_userdata(pss), - NULL, par->ctr, par->flags)) + + n = ssi->state(client_pss_to_userdata(pss), + NULL, par->ctr, par->flags); + switch (n) { + case LWSSSSRET_OK: + break; + case LWSSSSRET_DISCONNECT_ME: goto hangup; + case LWSSSSRET_DESTROY_ME: + return LWSSSSRET_DESTROY_ME; + } + swallow: break; - default: goto hangup; } } - return 0; + return LWSSSSRET_OK; hangup: - return -1; + return LWSSSSRET_DISCONNECT_ME; }