From: Ivan Poddubny Date: Sat, 23 May 2015 09:36:18 +0000 (+0300) Subject: res_pjsip_transport_websocket: Fix crash on receiving large SIP packets X-Git-Tag: 13.5.0-rc1~121 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=554bd1e39c704a20226c1f8573fe30a327e9ae98;p=thirdparty%2Fasterisk.git res_pjsip_transport_websocket: Fix crash on receiving large SIP packets Incoming SIP packets larger than PJSIP_MAX_PKT_LEN were themselves truncated before passing to pjsip_tpmgr_receive_packet, but the length was passed unaltered, thus causing memory corruption and segfault. ASTERISK-25122 #close Change-Id: I608a6b6b7f229eacc33a0a7d771d18e27e5b08ab --- diff --git a/res/res_pjsip_transport_websocket.c b/res/res_pjsip_transport_websocket.c index 94902d65bf..ab8c9c3e44 100644 --- a/res/res_pjsip_transport_websocket.c +++ b/res/res_pjsip_transport_websocket.c @@ -197,12 +197,13 @@ static int transport_read(void *data) pjsip_rx_data *rdata = &newtransport->rdata; int recvd; pj_str_t buf; + int pjsip_pkt_len; pj_gettimeofday(&rdata->pkt_info.timestamp); - 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; + pjsip_pkt_len = PJSIP_MAX_PKT_LEN < read_data->payload_len ? PJSIP_MAX_PKT_LEN : read_data->payload_len; + pj_memcpy(rdata->pkt_info.packet, read_data->payload, pjsip_pkt_len); + rdata->pkt_info.len = pjsip_pkt_len; rdata->pkt_info.zero = 0; pj_sockaddr_parse(pj_AF_UNSPEC(), 0, pj_cstr(&buf, ast_sockaddr_stringify(ast_websocket_remote_address(session))), &rdata->pkt_info.src_addr);