net: websocket: Revise generation of Sec-WebSocket-Accept header
This removes some tricky math to calculate lengths and offsets,
ensuring that, when appending the WebSocket UUID to the handshake
key, the key_accept buffer won't overflow.
Coverity-ID: 183057
Signed-off-by: Leandro Pereira <leandro.pereira@intel.com>
diff --git a/subsys/net/lib/websocket/websocket.c b/subsys/net/lib/websocket/websocket.c
index 5a3874e..b3a445a 100644
--- a/subsys/net/lib/websocket/websocket.c
+++ b/subsys/net/lib/websocket/websocket.c
@@ -354,6 +354,7 @@
struct net_pkt *pkt;
char tmp[64];
int ret;
+ size_t key_len;
size_t olen;
pkt = net_app_get_net_pkt_with_dst(&ctx->app_ctx,
@@ -368,20 +369,15 @@
goto fail;
}
- olen = min(sizeof(key_accept) - 1,
- ctx->http.field_values[ws_sec_key].value_len);
- strncpy(key_accept, ctx->http.field_values[ws_sec_key].value, olen);
+ key_len = min(sizeof(key_accept) - 1,
+ ctx->http.field_values[ws_sec_key].value_len);
+ strncpy(key_accept, ctx->http.field_values[ws_sec_key].value,
+ key_len);
- olen = min(sizeof(key_accept) - 1 -
- ctx->http.field_values[ws_sec_key].value_len,
- sizeof(WS_MAGIC) - 1);
- strncpy(key_accept + ctx->http.field_values[ws_sec_key].value_len,
- WS_MAGIC, olen);
+ olen = min(sizeof(key_accept) - 1 - key_len, sizeof(WS_MAGIC) - 1);
+ strncpy(key_accept + key_len, WS_MAGIC, olen);
- olen = ctx->http.field_values[ws_sec_key].value_len +
- sizeof(WS_MAGIC) - 1;
-
- mbedtls_sha1(key_accept, olen, accept);
+ mbedtls_sha1(key_accept, olen + key_len, accept);
ret = base64_encode(tmp, sizeof(tmp) - 1, &olen, accept,
sizeof(accept));