use context service buffer instead of stack for lws_client_socket_service
Signed-off-by: Andy Green <andy.green@linaro.org>
diff --git a/lib/client.c b/lib/client.c
index 81fc08c..3461754 100644
--- a/lib/client.c
+++ b/lib/client.c
@@ -42,8 +42,7 @@
int lws_client_socket_service(struct libwebsocket_context *context, struct libwebsocket *wsi, struct pollfd *pollfd)
{
int n;
- char pkt[1024];
- char *p = &pkt[0];
+ char *p = (char *)&context->service_buffer[0];
int len;
char c;
#ifdef LWS_OPENSSL_SUPPORT
@@ -66,7 +65,8 @@
return 0;
}
- n = recv(wsi->sock, pkt, sizeof pkt, 0);
+ n = recv(wsi->sock, context->service_buffer,
+ sizeof context->service_buffer, 0);
if (n < 0) {
libwebsocket_close_and_free_session(context, wsi,
LWS_CLOSE_STATUS_NOSTATUS);
@@ -74,11 +74,11 @@
return 0;
}
- pkt[13] = '\0';
- if (strcmp(pkt, "HTTP/1.0 200 ") != 0) {
+ context->service_buffer[13] = '\0';
+ if (strcmp((char *)context->service_buffer, "HTTP/1.0 200 ")) {
libwebsocket_close_and_free_session(context, wsi,
LWS_CLOSE_STATUS_NOSTATUS);
- lwsl_err("ERROR from proxy: %s\n", pkt);
+ lwsl_err("ERROR from proxy: %s\n", context->service_buffer);
return 0;
}
@@ -214,10 +214,10 @@
lws_latency_pre(context, wsi);
#ifdef LWS_OPENSSL_SUPPORT
if (wsi->use_ssl)
- n = SSL_write(wsi->ssl, pkt, p - pkt);
+ n = SSL_write(wsi->ssl, context->service_buffer, p - (char *)context->service_buffer);
else
#endif
- n = send(wsi->sock, pkt, p - pkt, 0);
+ n = send(wsi->sock, context->service_buffer, p - (char *)context->service_buffer, 0);
lws_latency(context, wsi, "send or SSL_write LWS_CONNMODE_WS_CLIENT_ISSUE_HANDSHAKE", n, n >= 0);
if (n < 0) {
@@ -694,6 +694,7 @@
libwebsockets_generate_client_handshake(struct libwebsocket_context *context,
struct libwebsocket *wsi, char *pkt)
{
+ char buf[128];
char hash[20];
char key_b64[40];
char *p = pkt;
@@ -836,16 +837,15 @@
context->protocols[0].callback(context, wsi,
LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER,
- NULL, &p, (pkt + sizeof(pkt)) - p - 12);
+ NULL, &p, (pkt + sizeof(context->service_buffer)) - p - 12);
p += sprintf(p, "\x0d\x0a");
/* prepare the expected server accept response */
- strcpy((char *)context->service_buffer, key_b64);
- strcpy((char *)&context->service_buffer[strlen((char *)context->service_buffer)], magic_websocket_guid);
-
- SHA1(context->service_buffer, strlen((char *)context->service_buffer), (unsigned char *)hash);
+ n = snprintf(buf, sizeof buf, "%s%s", key_b64, magic_websocket_guid);
+ buf[sizeof(buf) - 1] = '\0';
+ SHA1((unsigned char *)buf, n, (unsigned char *)hash);
lws_b64_encode_string(hash, 20,
wsi->u.hdr.initial_handshake_hash_base64,