mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-03 11:11:05 +00:00
Fix a SIP request memory leak with TLS connections.
During the TLS re-work in chan_sip some TLS specific code was moved into a separate function. This function operates on a copy of the incoming SIP request. This copy was never deinitialized causing a memory leak for each request processed. This function is now given a SIP request structure which it can use to copy the incoming request into. This reduces the amount of memory allocations done since the internal allocated components are reused between packets and also ensures the SIP request structure is deinitialized when the TLS connection is torn down. (closes issue ASTERISK-20763) Reported by: deti ........ Merged revisions 377257 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 377258 from http://svn.asterisk.org/svn/asterisk/branches/10 ........ Merged revisions 377259 from http://svn.asterisk.org/svn/asterisk/branches/11 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@377260 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -2714,10 +2714,10 @@ static int sip_check_authtimeout(time_t start)
|
|||||||
* \retval -1 Failed to read data
|
* \retval -1 Failed to read data
|
||||||
* \retval 0 Succeeded in reading data
|
* \retval 0 Succeeded in reading data
|
||||||
*/
|
*/
|
||||||
static int sip_tls_read(struct sip_request *req, struct ast_tcptls_session_instance *tcptls_session, int authenticated, time_t start, struct sip_threadinfo *me)
|
static int sip_tls_read(struct sip_request *req, struct sip_request *reqcpy, struct ast_tcptls_session_instance *tcptls_session,
|
||||||
|
int authenticated, time_t start, struct sip_threadinfo *me)
|
||||||
{
|
{
|
||||||
int res, content_length, after_poll = 1, need_poll = 1;
|
int res, content_length, after_poll = 1, need_poll = 1;
|
||||||
struct sip_request reqcpy = { 0, };
|
|
||||||
char buf[1024] = "";
|
char buf[1024] = "";
|
||||||
int timeout = -1;
|
int timeout = -1;
|
||||||
|
|
||||||
@@ -2771,10 +2771,10 @@ static int sip_tls_read(struct sip_request *req, struct ast_tcptls_session_insta
|
|||||||
}
|
}
|
||||||
ast_str_append(&req->data, 0, "%s", buf);
|
ast_str_append(&req->data, 0, "%s", buf);
|
||||||
}
|
}
|
||||||
copy_request(&reqcpy, req);
|
copy_request(reqcpy, req);
|
||||||
parse_request(&reqcpy);
|
parse_request(reqcpy);
|
||||||
/* In order to know how much to read, we need the content-length header */
|
/* In order to know how much to read, we need the content-length header */
|
||||||
if (sscanf(sip_get_header(&reqcpy, "Content-Length"), "%30d", &content_length)) {
|
if (sscanf(sip_get_header(reqcpy, "Content-Length"), "%30d", &content_length)) {
|
||||||
while (content_length > 0) {
|
while (content_length > 0) {
|
||||||
size_t bytes_read;
|
size_t bytes_read;
|
||||||
if (!tcptls_session->client && !authenticated) {
|
if (!tcptls_session->client && !authenticated) {
|
||||||
@@ -3187,7 +3187,7 @@ static void *_sip_tcp_helper_thread(struct ast_tcptls_session_instance *tcptls_s
|
|||||||
}
|
}
|
||||||
req.socket.fd = tcptls_session->fd;
|
req.socket.fd = tcptls_session->fd;
|
||||||
if (tcptls_session->ssl) {
|
if (tcptls_session->ssl) {
|
||||||
res = sip_tls_read(&req, tcptls_session, authenticated, start, me);
|
res = sip_tls_read(&req, &reqcpy, tcptls_session, authenticated, start, me);
|
||||||
} else {
|
} else {
|
||||||
res = sip_tcp_read(&req, tcptls_session, authenticated, start);
|
res = sip_tcp_read(&req, tcptls_session, authenticated, start);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user