summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
Diffstat (limited to 'res')
-rw-r--r--res/res_http_websocket.c27
-rw-r--r--res/res_pjsip_transport_websocket.c3
2 files changed, 18 insertions, 12 deletions
diff --git a/res/res_http_websocket.c b/res/res_http_websocket.c
index e47bcd231..400e5eb1c 100644
--- a/res/res_http_websocket.c
+++ b/res/res_http_websocket.c
@@ -513,14 +513,6 @@ int AST_OPTIONAL_API_NAME(ast_websocket_read)(struct ast_websocket *session, cha
}
}
- if (!(new_payload = ast_realloc(session->payload, (session->payload_len + *payload_len)))) {
- ast_log(LOG_WARNING, "Failed allocation: %p, %zu, %"PRIu64"\n",
- session->payload, session->payload_len, *payload_len);
- *payload_len = 0;
- ast_websocket_close(session, 1009);
- return 0;
- }
-
/* Per the RFC for PING we need to send back an opcode with the application data as received */
if ((*opcode == AST_WEBSOCKET_OPCODE_PING) && (ast_websocket_write(session, AST_WEBSOCKET_OPCODE_PONG, *payload, *payload_len))) {
*payload_len = 0;
@@ -528,9 +520,22 @@ int AST_OPTIONAL_API_NAME(ast_websocket_read)(struct ast_websocket *session, cha
return 0;
}
- session->payload = new_payload;
- memcpy((session->payload + session->payload_len), (*payload), (*payload_len));
- session->payload_len += *payload_len;
+ if (*payload_len) {
+ if (!(new_payload = ast_realloc(session->payload, (session->payload_len + *payload_len)))) {
+ ast_log(LOG_WARNING, "Failed allocation: %p, %zu, %"PRIu64"\n",
+ session->payload, session->payload_len, *payload_len);
+ *payload_len = 0;
+ ast_websocket_close(session, 1009);
+ return 0;
+ }
+
+ session->payload = new_payload;
+ memcpy((session->payload + session->payload_len), (*payload), (*payload_len));
+ session->payload_len += *payload_len;
+ } else if (!session->payload_len && session->payload) {
+ ast_free(session->payload);
+ session->payload = NULL;
+ }
if (!fin && session->reconstruct && (session->payload_len < session->reconstruct)) {
/* If this is not a final message we need to defer returning it until later */
diff --git a/res/res_pjsip_transport_websocket.c b/res/res_pjsip_transport_websocket.c
index 1db36bb5a..5616715e0 100644
--- a/res/res_pjsip_transport_websocket.c
+++ b/res/res_pjsip_transport_websocket.c
@@ -200,7 +200,8 @@ static int transport_read(void *data)
pj_gettimeofday(&rdata->pkt_info.timestamp);
- pj_memcpy(rdata->pkt_info.packet, read_data->payload, sizeof(rdata->pkt_info.packet));
+ pj_memcpy(rdata->pkt_info.packet, read_data->payload,
+ PJSIP_MAX_PKT_LEN < read_data->payload_len ? PJSIP_MAX_PKT_LEN : read_data->payload_len);
rdata->pkt_info.len = read_data->payload_len;
rdata->pkt_info.zero = 0;