diff options
author | Sean Bright <sean.bright@gmail.com> | 2018-02-18 11:27:38 -0500 |
---|---|---|
committer | Sean Bright <sean.bright@gmail.com> | 2018-02-19 07:24:51 -0600 |
commit | 8b18247af6d29e4b146c622f0a5a7f6866662360 (patch) | |
tree | c67224ab609da2d12c078b7dc21ee6a568dc1824 /res | |
parent | ddc607f85a2a7f0cc8fbde4f30d09510c5e2f2cc (diff) |
res_http_websocket: Don't leak memory on read failure
Change-Id: Ic449ea832bc81a1671c0e910c5fbe8c683e3da89
Diffstat (limited to 'res')
-rw-r--r-- | res/res_http_websocket.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/res/res_http_websocket.c b/res/res_http_websocket.c index bcad1c39c..81e4970a6 100644 --- a/res/res_http_websocket.c +++ b/res/res_http_websocket.c @@ -666,18 +666,27 @@ int AST_OPTIONAL_API_NAME(ast_websocket_read)(struct ast_websocket *session, cha session->payload_len = 0; } } else if (*opcode == AST_WEBSOCKET_OPCODE_CLOSE) { + session->closing = 1; + /* Make the payload available so the user can look at the reason code if they so desire */ - if ((*payload_len) && (new_payload = ast_realloc(session->payload, *payload_len))) { - if (ws_safe_read(session, &buf[frame_size], (*payload_len), opcode)) { - return -1; - } - session->payload = new_payload; - memcpy(session->payload, &buf[frame_size], *payload_len); - *payload = session->payload; - frame_size += (*payload_len); + if (!*payload_len) { + return 0; } - session->closing = 1; + if (!(new_payload = ast_realloc(session->payload, *payload_len))) { + ast_log(LOG_WARNING, "Failed allocation: %p, %"PRIu64"\n", + session->payload, *payload_len); + *payload_len = 0; + return -1; + } + + session->payload = new_payload; + if (ws_safe_read(session, &buf[frame_size], *payload_len, opcode)) { + return -1; + } + memcpy(session->payload, &buf[frame_size], *payload_len); + *payload = session->payload; + frame_size += *payload_len; } else { ast_log(LOG_WARNING, "WebSocket unknown opcode %u\n", *opcode); /* We received an opcode that we don't understand, the RFC states that 1003 is for a type of data that can't be accepted... opcodes |