1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-03 00:03:12 +02:00

relay: fix crash when decoding a websocket frame

This commit is contained in:
Sebastien Helleu
2013-02-12 14:14:40 +01:00
parent 8d5dee9aa0
commit f7811b0ae2
3 changed files with 18 additions and 7 deletions
+9 -4
View File
@@ -391,9 +391,10 @@ int
relay_client_recv_cb (void *arg_client, int fd)
{
struct t_relay_client *client;
static char buffer[4096], decoded[4096];
static char buffer[4096], decoded[4096 + 1];
const char *ptr_buffer;
int num_read;
int num_read, rc;
unsigned long long decoded_length;
/* make C compiler happy */
(void) fd;
@@ -443,8 +444,11 @@ relay_client_recv_cb (void *arg_client, int fd)
if (client->websocket == 2)
{
/* websocket used, decode message */
if (!relay_websocket_decode_frame ((unsigned char *)buffer, num_read,
(unsigned char *)decoded))
rc = relay_websocket_decode_frame ((unsigned char *)buffer,
(unsigned long long)num_read,
(unsigned char *)decoded,
&decoded_length);
if (!rc || (decoded_length == 0))
{
/* error when decoding frame: close connection */
weechat_printf_tags (NULL, "relay_client",
@@ -458,6 +462,7 @@ relay_client_recv_cb (void *arg_client, int fd)
return WEECHAT_RC_OK;
}
ptr_buffer = decoded;
num_read = (int)decoded_length;
}
if ((client->websocket == 1)
+6 -1
View File
@@ -263,10 +263,13 @@ relay_websocket_send_http (struct t_relay_client *client,
int
relay_websocket_decode_frame (const unsigned char *buffer,
unsigned long long length,
unsigned char *decoded)
unsigned char *decoded,
unsigned long long *decoded_length)
{
unsigned long long i, index, length_frame_size, length_frame;
*decoded_length = 0;
if (length < 2)
return 0;
@@ -312,6 +315,8 @@ relay_websocket_decode_frame (const unsigned char *buffer,
}
decoded[length_frame] = '\0';
*decoded_length = length_frame;
return 1;
}
+3 -2
View File
@@ -28,8 +28,9 @@ extern char *relay_websocket_build_handshake (struct t_relay_client *client);
extern void relay_websocket_send_http (struct t_relay_client *client,
const char *http);
extern int relay_websocket_decode_frame (const unsigned char *buffer,
int length,
unsigned char *decoded);
unsigned long long length,
unsigned char *decoded,
unsigned long long *decoded_length);
extern char *relay_websocket_encode_frame (struct t_relay_client *client,
const char *buffer,
unsigned long long length,