mirror of
https://github.com/asterisk/asterisk.git
synced 2025-08-25 23:16:11 +00:00
Compare commits
20 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
a06b72ee1e | ||
|
8e6183f624 | ||
|
13a9b7a6d9 | ||
|
e41fd7b22f | ||
|
61a50ebecf | ||
|
e31d487b51 | ||
|
9931fb4c73 | ||
|
2157c83db3 | ||
|
e3c20131d8 | ||
|
dcfed79861 | ||
|
8543e62278 | ||
|
930582391d | ||
|
8660079629 | ||
|
e294ec5462 | ||
|
0401d7648f | ||
|
c0cf363199 | ||
|
2423658b06 | ||
|
fc053ad7a7 | ||
|
e15a8a5066 | ||
|
c6d2d98a91 |
1
.lastclean
Normal file
1
.lastclean
Normal file
@@ -0,0 +1 @@
|
||||
40
|
63
asterisk-11.8.1-summary.html
Normal file
63
asterisk-11.8.1-summary.html
Normal file
@@ -0,0 +1,63 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Release Summary - asterisk-11.8.1</title></head>
|
||||
<body>
|
||||
<h1 align="center"><a name="top">Release Summary</a></h1>
|
||||
<h3 align="center">asterisk-11.8.1</h3>
|
||||
<h3 align="center">Date: 2014-03-10</h3>
|
||||
<h3 align="center"><asteriskteam@digium.com></h3>
|
||||
<hr/>
|
||||
<h2 align="center">Table of Contents</h2>
|
||||
<ol>
|
||||
<li><a href="#summary">Summary</a></li>
|
||||
<li><a href="#contributors">Contributors</a></li>
|
||||
<li><a href="#commits">Other Changes</a></li>
|
||||
<li><a href="#diffstat">Diffstat</a></li>
|
||||
</ol>
|
||||
<hr/>
|
||||
<a name="summary"><h2 align="center">Summary</h2></a>
|
||||
<center><a href="#top">[Back to Top]</a></center><br/><p>This release has been made to address one or more security vulnerabilities that have been identified. A security advisory document has been published for each vulnerability that includes additional information. Users of versions of Asterisk that are affected are strongly encouraged to review the advisories and determine what action they should take to protect their systems from these issues.</p>
|
||||
<p>Security Advisories: <a href="http://downloads.asterisk.org/pub/security/AST-2014-001.html">AST-2014-001</a>, <a href="http://downloads.asterisk.org/pub/security/AST-2014-002.html">AST-2014-002</a></p>
|
||||
<p>The data in this summary reflects changes that have been made since the previous release, asterisk-11.8.0.</p>
|
||||
<hr/>
|
||||
<a name="contributors"><h2 align="center">Contributors</h2></a>
|
||||
<center><a href="#top">[Back to Top]</a></center><br/><p>This table lists the people who have submitted code, those that have tested patches, as well as those that reported issues on the issue tracker that were resolved in this release. For coders, the number is how many of their patches (of any size) were committed into this release. For testers, the number is the number of times their name was listed as assisting with testing a patch. Finally, for reporters, the number is the number of issues that they reported that were closed by commits that went into this release.</p>
|
||||
<table width="100%" border="0">
|
||||
<tr>
|
||||
<td width="33%"><h3>Coders</h3></td>
|
||||
<td width="33%"><h3>Testers</h3></td>
|
||||
<td width="33%"><h3>Reporters</h3></td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<td>
|
||||
3 bebuild<br/>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<hr/>
|
||||
<a name="commits"><h2 align="center">Commits Not Associated with an Issue</h2></a>
|
||||
<center><a href="#top">[Back to Top]</a></center><br/><p>This is a list of all changes that went into this release that did not directly close an issue from the issue tracker. The commits may have been marked as being related to an issue. If that is the case, the issue numbers are listed here, as well.</p>
|
||||
<table width="100%" border="1">
|
||||
<tr><td><b>Revision</b></td><td><b>Author</b></td><td><b>Summary</b></td><td><b>Issues Referenced</b></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/tags/11.8.1?view=revision&revision=410373">410373</a></td><td>bebuild</td><td>Create 11.8.1</td>
|
||||
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/tags/11.8.1?view=revision&revision=410378">410378</a></td><td>bebuild</td><td>Update version, remove old summaries</td>
|
||||
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/tags/11.8.1?view=revision&revision=410431">410431</a></td><td>bebuild</td><td>AST-2014-001: AST-2014-002: Merge into 11.8.1</td>
|
||||
<td></td></tr></table>
|
||||
<hr/>
|
||||
<a name="diffstat"><h2 align="center">Diffstat Results</h2></a>
|
||||
<center><a href="#top">[Back to Top]</a></center><br/><p>This is a summary of the changes to the source code that went into this release that was generated using the diffstat utility.</p>
|
||||
<pre>
|
||||
.version | 2
|
||||
ChangeLog | 29 ++
|
||||
asterisk-11.8.0-summary.html | 435 ------------------------------------
|
||||
asterisk-11.8.0-summary.txt | 517 -------------------------------------------
|
||||
channels/chan_sip.c | 303 +++++++++++++------------
|
||||
main/http.c | 49 ++--
|
||||
6 files changed, 220 insertions(+), 1115 deletions(-)
|
||||
</pre><br/>
|
||||
<hr/>
|
||||
</body>
|
||||
</html>
|
94
asterisk-11.8.1-summary.txt
Normal file
94
asterisk-11.8.1-summary.txt
Normal file
@@ -0,0 +1,94 @@
|
||||
Release Summary
|
||||
|
||||
asterisk-11.8.1
|
||||
|
||||
Date: 2014-03-10
|
||||
|
||||
<asteriskteam@digium.com>
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Table of Contents
|
||||
|
||||
1. Summary
|
||||
2. Contributors
|
||||
3. Other Changes
|
||||
4. Diffstat
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Summary
|
||||
|
||||
[Back to Top]
|
||||
|
||||
This release has been made to address one or more security vulnerabilities
|
||||
that have been identified. A security advisory document has been published
|
||||
for each vulnerability that includes additional information. Users of
|
||||
versions of Asterisk that are affected are strongly encouraged to review
|
||||
the advisories and determine what action they should take to protect their
|
||||
systems from these issues.
|
||||
|
||||
Security Advisories: AST-2014-001, AST-2014-002
|
||||
|
||||
The data in this summary reflects changes that have been made since the
|
||||
previous release, asterisk-11.8.0.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Contributors
|
||||
|
||||
[Back to Top]
|
||||
|
||||
This table lists the people who have submitted code, those that have
|
||||
tested patches, as well as those that reported issues on the issue tracker
|
||||
that were resolved in this release. For coders, the number is how many of
|
||||
their patches (of any size) were committed into this release. For testers,
|
||||
the number is the number of times their name was listed as assisting with
|
||||
testing a patch. Finally, for reporters, the number is the number of
|
||||
issues that they reported that were closed by commits that went into this
|
||||
release.
|
||||
|
||||
Coders Testers Reporters
|
||||
3 bebuild
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Commits Not Associated with an Issue
|
||||
|
||||
[Back to Top]
|
||||
|
||||
This is a list of all changes that went into this release that did not
|
||||
directly close an issue from the issue tracker. The commits may have been
|
||||
marked as being related to an issue. If that is the case, the issue
|
||||
numbers are listed here, as well.
|
||||
|
||||
+------------------------------------------------------------------------+
|
||||
| Revision | Author | Summary | Issues Referenced |
|
||||
|----------+---------+-------------------------------+-------------------|
|
||||
| 410373 | bebuild | Create 11.8.1 | |
|
||||
|----------+---------+-------------------------------+-------------------|
|
||||
| 410378 | bebuild | Update version, remove old | |
|
||||
| | | summaries | |
|
||||
|----------+---------+-------------------------------+-------------------|
|
||||
| 410431 | bebuild | AST-2014-001: AST-2014-002: | |
|
||||
| | | Merge into 11.8.1 | |
|
||||
+------------------------------------------------------------------------+
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Diffstat Results
|
||||
|
||||
[Back to Top]
|
||||
|
||||
This is a summary of the changes to the source code that went into this
|
||||
release that was generated using the diffstat utility.
|
||||
|
||||
.version | 2
|
||||
ChangeLog | 29 ++
|
||||
asterisk-11.8.0-summary.html | 435 ------------------------------------
|
||||
asterisk-11.8.0-summary.txt | 517 -------------------------------------------
|
||||
channels/chan_sip.c | 303 +++++++++++++------------
|
||||
main/http.c | 49 ++--
|
||||
6 files changed, 220 insertions(+), 1115 deletions(-)
|
||||
|
||||
----------------------------------------------------------------------
|
@@ -22856,9 +22856,11 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
|
||||
/* This 200 OK's SDP is not acceptable, so we need to ack, then hangup */
|
||||
/* For re-invites, we try to recover */
|
||||
ast_set_flag(&p->flags[0], SIP_PENDINGBYE);
|
||||
ast_channel_hangupcause_set(p->owner, AST_CAUSE_BEARERCAPABILITY_NOTAVAIL);
|
||||
p->hangupcause = AST_CAUSE_BEARERCAPABILITY_NOTAVAIL;
|
||||
sip_queue_hangup_cause(p, AST_CAUSE_BEARERCAPABILITY_NOTAVAIL);
|
||||
if (p->owner) {
|
||||
ast_channel_hangupcause_set(p->owner, AST_CAUSE_BEARERCAPABILITY_NOTAVAIL);
|
||||
sip_queue_hangup_cause(p, AST_CAUSE_BEARERCAPABILITY_NOTAVAIL);
|
||||
}
|
||||
}
|
||||
}
|
||||
ast_rtp_instance_activate(p->rtp);
|
||||
@@ -25002,6 +25004,145 @@ static int handle_request_update(struct sip_pvt *p, struct sip_request *req)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* \internal \brief Check Session Timers for an INVITE request
|
||||
*
|
||||
* \retval 0 ok
|
||||
* \retval -1 failure
|
||||
*/
|
||||
static int handle_request_invite_st(struct sip_pvt *p, struct sip_request *req,
|
||||
const char *required, int reinvite)
|
||||
{
|
||||
const char *p_uac_se_hdr; /* UAC's Session-Expires header string */
|
||||
const char *p_uac_min_se; /* UAC's requested Min-SE interval (char string) */
|
||||
int uac_max_se = -1; /* UAC's Session-Expires in integer format */
|
||||
int uac_min_se = -1; /* UAC's Min-SE in integer format */
|
||||
int st_active = FALSE; /* Session-Timer on/off boolean */
|
||||
int st_interval = 0; /* Session-Timer negotiated refresh interval */
|
||||
enum st_refresher tmp_st_ref = SESSION_TIMER_REFRESHER_AUTO; /* Session-Timer refresher */
|
||||
int dlg_min_se = -1;
|
||||
int dlg_max_se = global_max_se;
|
||||
int rtn;
|
||||
|
||||
/* Session-Timers */
|
||||
if ((p->sipoptions & SIP_OPT_TIMER)) {
|
||||
enum st_refresher_param st_ref_param = SESSION_TIMER_REFRESHER_PARAM_UNKNOWN;
|
||||
|
||||
/* The UAC has requested session-timers for this session. Negotiate
|
||||
the session refresh interval and who will be the refresher */
|
||||
ast_debug(2, "Incoming INVITE with 'timer' option supported\n");
|
||||
|
||||
/* Allocate Session-Timers struct w/in the dialog */
|
||||
if (!p->stimer) {
|
||||
sip_st_alloc(p);
|
||||
}
|
||||
|
||||
/* Parse the Session-Expires header */
|
||||
p_uac_se_hdr = sip_get_header(req, "Session-Expires");
|
||||
if (!ast_strlen_zero(p_uac_se_hdr)) {
|
||||
ast_debug(2, "INVITE also has \"Session-Expires\" header.\n");
|
||||
rtn = parse_session_expires(p_uac_se_hdr, &uac_max_se, &st_ref_param);
|
||||
tmp_st_ref = (st_ref_param == SESSION_TIMER_REFRESHER_PARAM_UAC) ? SESSION_TIMER_REFRESHER_THEM : SESSION_TIMER_REFRESHER_US;
|
||||
if (rtn != 0) {
|
||||
transmit_response_reliable(p, "400 Session-Expires Invalid Syntax", req);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Parse the Min-SE header */
|
||||
p_uac_min_se = sip_get_header(req, "Min-SE");
|
||||
if (!ast_strlen_zero(p_uac_min_se)) {
|
||||
ast_debug(2, "INVITE also has \"Min-SE\" header.\n");
|
||||
rtn = parse_minse(p_uac_min_se, &uac_min_se);
|
||||
if (rtn != 0) {
|
||||
transmit_response_reliable(p, "400 Min-SE Invalid Syntax", req);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
dlg_min_se = st_get_se(p, FALSE);
|
||||
switch (st_get_mode(p, 1)) {
|
||||
case SESSION_TIMER_MODE_ACCEPT:
|
||||
case SESSION_TIMER_MODE_ORIGINATE:
|
||||
if (uac_max_se > 0 && uac_max_se < dlg_min_se) {
|
||||
transmit_response_with_minse(p, "422 Session Interval Too Small", req, dlg_min_se);
|
||||
return -1;
|
||||
}
|
||||
|
||||
p->stimer->st_active_peer_ua = TRUE;
|
||||
st_active = TRUE;
|
||||
if (st_ref_param == SESSION_TIMER_REFRESHER_PARAM_UNKNOWN) {
|
||||
tmp_st_ref = st_get_refresher(p);
|
||||
}
|
||||
|
||||
dlg_max_se = st_get_se(p, TRUE);
|
||||
if (uac_max_se > 0) {
|
||||
if (dlg_max_se >= uac_min_se) {
|
||||
st_interval = (uac_max_se < dlg_max_se) ? uac_max_se : dlg_max_se;
|
||||
} else {
|
||||
st_interval = uac_max_se;
|
||||
}
|
||||
} else if (uac_min_se > 0) {
|
||||
st_interval = MAX(dlg_max_se, uac_min_se);
|
||||
} else {
|
||||
st_interval = dlg_max_se;
|
||||
}
|
||||
break;
|
||||
|
||||
case SESSION_TIMER_MODE_REFUSE:
|
||||
if (p->reqsipoptions & SIP_OPT_TIMER) {
|
||||
transmit_response_with_unsupported(p, "420 Option Disabled", req, required);
|
||||
ast_log(LOG_WARNING, "Received SIP INVITE with supported but disabled option: %s\n", required);
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
ast_log(LOG_ERROR, "Internal Error %d at %s:%d\n", st_get_mode(p, 1), __FILE__, __LINE__);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
/* The UAC did not request session-timers. Asterisk (UAS), will now decide
|
||||
(based on session-timer-mode in sip.conf) whether to run session-timers for
|
||||
this session or not. */
|
||||
switch (st_get_mode(p, 1)) {
|
||||
case SESSION_TIMER_MODE_ORIGINATE:
|
||||
st_active = TRUE;
|
||||
st_interval = st_get_se(p, TRUE);
|
||||
tmp_st_ref = SESSION_TIMER_REFRESHER_US;
|
||||
p->stimer->st_active_peer_ua = (p->sipoptions & SIP_OPT_TIMER) ? TRUE : FALSE;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (reinvite == 0) {
|
||||
/* Session-Timers: Start session refresh timer based on negotiation/config */
|
||||
if (st_active == TRUE) {
|
||||
p->stimer->st_active = TRUE;
|
||||
p->stimer->st_interval = st_interval;
|
||||
p->stimer->st_ref = tmp_st_ref;
|
||||
}
|
||||
} else {
|
||||
if (p->stimer->st_active == TRUE) {
|
||||
/* Session-Timers: A re-invite request sent within a dialog will serve as
|
||||
a refresh request, no matter whether the re-invite was sent for refreshing
|
||||
the session or modifying it.*/
|
||||
ast_debug (2, "Restarting session-timers on a refresh - %s\n", p->callid);
|
||||
|
||||
/* The UAC may be adjusting the session-timers mid-session */
|
||||
if (st_interval > 0) {
|
||||
p->stimer->st_interval = st_interval;
|
||||
p->stimer->st_ref = tmp_st_ref;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Handle incoming INVITE request
|
||||
* \note If the INVITE has a Replaces header, it is part of an
|
||||
@@ -25021,19 +25162,9 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, str
|
||||
struct ast_channel *c = NULL; /* New channel */
|
||||
struct sip_peer *authpeer = NULL; /* Matching Peer */
|
||||
int reinvite = 0;
|
||||
int rtn;
|
||||
struct ast_party_redirecting redirecting;
|
||||
struct ast_set_party_redirecting update_redirecting;
|
||||
|
||||
const char *p_uac_se_hdr; /* UAC's Session-Expires header string */
|
||||
const char *p_uac_min_se; /* UAC's requested Min-SE interval (char string) */
|
||||
int uac_max_se = -1; /* UAC's Session-Expires in integer format */
|
||||
int uac_min_se = -1; /* UAC's Min-SE in integer format */
|
||||
int st_active = FALSE; /* Session-Timer on/off boolean */
|
||||
int st_interval = 0; /* Session-Timer negotiated refresh interval */
|
||||
enum st_refresher tmp_st_ref = SESSION_TIMER_REFRESHER_AUTO; /* Session-Timer refresher */
|
||||
int dlg_min_se = -1;
|
||||
int dlg_max_se = global_max_se;
|
||||
struct {
|
||||
char exten[AST_MAX_EXTENSION];
|
||||
char context[AST_MAX_CONTEXT];
|
||||
@@ -25521,6 +25652,14 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, str
|
||||
/* Initialize our tag */
|
||||
|
||||
make_our_tag(p);
|
||||
|
||||
if (handle_request_invite_st(p, req, required, reinvite)) {
|
||||
p->invitestate = INV_COMPLETED;
|
||||
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
|
||||
res = INV_REQ_ERROR;
|
||||
goto request_invite_cleanup;
|
||||
}
|
||||
|
||||
/* First invitation - create the channel. Allocation
|
||||
* failures are handled below. */
|
||||
|
||||
@@ -25555,6 +25694,16 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, str
|
||||
}
|
||||
if (!req->ignore)
|
||||
reinvite = 1;
|
||||
|
||||
if (handle_request_invite_st(p, req, required, reinvite)) {
|
||||
p->invitestate = INV_COMPLETED;
|
||||
if (!p->lastinvite) {
|
||||
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
|
||||
}
|
||||
res = INV_REQ_ERROR;
|
||||
goto request_invite_cleanup;
|
||||
}
|
||||
|
||||
c = p->owner;
|
||||
change_redirecting_information(p, req, &redirecting, &update_redirecting, FALSE); /*Will return immediately if no Diversion header is present */
|
||||
if (c) {
|
||||
@@ -25566,140 +25715,10 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, str
|
||||
/* Check if OLI/ANI-II is present in From: */
|
||||
parse_oli(req, p->owner);
|
||||
|
||||
/* Session-Timers */
|
||||
if ((p->sipoptions & SIP_OPT_TIMER)) {
|
||||
enum st_refresher_param st_ref_param = SESSION_TIMER_REFRESHER_PARAM_UNKNOWN;
|
||||
|
||||
/* The UAC has requested session-timers for this session. Negotiate
|
||||
the session refresh interval and who will be the refresher */
|
||||
ast_debug(2, "Incoming INVITE with 'timer' option supported\n");
|
||||
|
||||
/* Allocate Session-Timers struct w/in the dialog */
|
||||
if (!p->stimer)
|
||||
sip_st_alloc(p);
|
||||
|
||||
/* Parse the Session-Expires header */
|
||||
p_uac_se_hdr = sip_get_header(req, "Session-Expires");
|
||||
if (!ast_strlen_zero(p_uac_se_hdr)) {
|
||||
ast_debug(2, "INVITE also has \"Session-Expires\" header.\n");
|
||||
rtn = parse_session_expires(p_uac_se_hdr, &uac_max_se, &st_ref_param);
|
||||
tmp_st_ref = (st_ref_param == SESSION_TIMER_REFRESHER_PARAM_UAC) ? SESSION_TIMER_REFRESHER_THEM : SESSION_TIMER_REFRESHER_US;
|
||||
if (rtn != 0) {
|
||||
transmit_response_reliable(p, "400 Session-Expires Invalid Syntax", req);
|
||||
p->invitestate = INV_COMPLETED;
|
||||
if (!p->lastinvite) {
|
||||
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
|
||||
}
|
||||
res = INV_REQ_ERROR;
|
||||
goto request_invite_cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
/* Parse the Min-SE header */
|
||||
p_uac_min_se = sip_get_header(req, "Min-SE");
|
||||
if (!ast_strlen_zero(p_uac_min_se)) {
|
||||
ast_debug(2, "INVITE also has \"Min-SE\" header.\n");
|
||||
rtn = parse_minse(p_uac_min_se, &uac_min_se);
|
||||
if (rtn != 0) {
|
||||
transmit_response_reliable(p, "400 Min-SE Invalid Syntax", req);
|
||||
p->invitestate = INV_COMPLETED;
|
||||
if (!p->lastinvite) {
|
||||
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
|
||||
}
|
||||
res = INV_REQ_ERROR;
|
||||
goto request_invite_cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
dlg_min_se = st_get_se(p, FALSE);
|
||||
switch (st_get_mode(p, 1)) {
|
||||
case SESSION_TIMER_MODE_ACCEPT:
|
||||
case SESSION_TIMER_MODE_ORIGINATE:
|
||||
if (uac_max_se > 0 && uac_max_se < dlg_min_se) {
|
||||
transmit_response_with_minse(p, "422 Session Interval Too Small", req, dlg_min_se);
|
||||
p->invitestate = INV_COMPLETED;
|
||||
if (!p->lastinvite) {
|
||||
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
|
||||
}
|
||||
res = INV_REQ_ERROR;
|
||||
goto request_invite_cleanup;
|
||||
}
|
||||
|
||||
p->stimer->st_active_peer_ua = TRUE;
|
||||
st_active = TRUE;
|
||||
if (st_ref_param == SESSION_TIMER_REFRESHER_PARAM_UNKNOWN) {
|
||||
tmp_st_ref = st_get_refresher(p);
|
||||
}
|
||||
|
||||
dlg_max_se = st_get_se(p, TRUE);
|
||||
if (uac_max_se > 0) {
|
||||
if (dlg_max_se >= uac_min_se) {
|
||||
st_interval = (uac_max_se < dlg_max_se) ? uac_max_se : dlg_max_se;
|
||||
} else {
|
||||
st_interval = uac_max_se;
|
||||
}
|
||||
} else if (uac_min_se > 0) {
|
||||
st_interval = MAX(dlg_max_se, uac_min_se);
|
||||
} else {
|
||||
st_interval = dlg_max_se;
|
||||
}
|
||||
break;
|
||||
|
||||
case SESSION_TIMER_MODE_REFUSE:
|
||||
if (p->reqsipoptions & SIP_OPT_TIMER) {
|
||||
transmit_response_with_unsupported(p, "420 Option Disabled", req, required);
|
||||
ast_log(LOG_WARNING, "Received SIP INVITE with supported but disabled option: %s\n", required);
|
||||
p->invitestate = INV_COMPLETED;
|
||||
if (!p->lastinvite) {
|
||||
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
|
||||
}
|
||||
res = INV_REQ_ERROR;
|
||||
goto request_invite_cleanup;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
ast_log(LOG_ERROR, "Internal Error %d at %s:%d\n", st_get_mode(p, 1), __FILE__, __LINE__);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
/* The UAC did not request session-timers. Asterisk (UAS), will now decide
|
||||
(based on session-timer-mode in sip.conf) whether to run session-timers for
|
||||
this session or not. */
|
||||
switch (st_get_mode(p, 1)) {
|
||||
case SESSION_TIMER_MODE_ORIGINATE:
|
||||
st_active = TRUE;
|
||||
st_interval = st_get_se(p, TRUE);
|
||||
tmp_st_ref = SESSION_TIMER_REFRESHER_US;
|
||||
p->stimer->st_active_peer_ua = (p->sipoptions & SIP_OPT_TIMER) ? TRUE : FALSE;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (reinvite == 0) {
|
||||
/* Session-Timers: Start session refresh timer based on negotiation/config */
|
||||
if (st_active == TRUE) {
|
||||
p->stimer->st_active = TRUE;
|
||||
p->stimer->st_interval = st_interval;
|
||||
p->stimer->st_ref = tmp_st_ref;
|
||||
if (p->stimer->st_active == TRUE) {
|
||||
if (reinvite == 0) {
|
||||
start_session_timer(p);
|
||||
}
|
||||
} else {
|
||||
if (p->stimer->st_active == TRUE) {
|
||||
/* Session-Timers: A re-invite request sent within a dialog will serve as
|
||||
a refresh request, no matter whether the re-invite was sent for refreshing
|
||||
the session or modifying it.*/
|
||||
ast_debug (2, "Restarting session-timers on a refresh - %s\n", p->callid);
|
||||
|
||||
/* The UAC may be adjusting the session-timers mid-session */
|
||||
if (st_interval > 0) {
|
||||
p->stimer->st_interval = st_interval;
|
||||
p->stimer->st_ref = tmp_st_ref;
|
||||
}
|
||||
|
||||
} else {
|
||||
restart_session_timer(p);
|
||||
}
|
||||
}
|
||||
|
49
main/http.c
49
main/http.c
@@ -186,9 +186,7 @@ uint32_t ast_http_manid_from_vars(struct ast_variable *headers)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (cookies) {
|
||||
ast_variables_destroy(cookies);
|
||||
}
|
||||
ast_variables_destroy(cookies);
|
||||
return mngid;
|
||||
}
|
||||
|
||||
@@ -805,12 +803,13 @@ static int ssl_close(void *cookie)
|
||||
}*/
|
||||
#endif /* DO_SSL */
|
||||
|
||||
static struct ast_variable *parse_cookies(char *cookies)
|
||||
static struct ast_variable *parse_cookies(const char *cookies)
|
||||
{
|
||||
char *parse = ast_strdupa(cookies);
|
||||
char *cur;
|
||||
struct ast_variable *vars = NULL, *var;
|
||||
|
||||
while ((cur = strsep(&cookies, ";"))) {
|
||||
while ((cur = strsep(&parse, ";"))) {
|
||||
char *name, *val;
|
||||
|
||||
name = val = cur;
|
||||
@@ -840,21 +839,19 @@ static struct ast_variable *parse_cookies(char *cookies)
|
||||
/* get cookie from Request headers */
|
||||
struct ast_variable *ast_http_get_cookies(struct ast_variable *headers)
|
||||
{
|
||||
struct ast_variable *v, *cookies=NULL;
|
||||
struct ast_variable *v, *cookies = NULL;
|
||||
|
||||
for (v = headers; v; v = v->next) {
|
||||
if (!strcasecmp(v->name, "Cookie")) {
|
||||
char *tmp = ast_strdupa(v->value);
|
||||
if (cookies) {
|
||||
ast_variables_destroy(cookies);
|
||||
}
|
||||
|
||||
cookies = parse_cookies(tmp);
|
||||
ast_variables_destroy(cookies);
|
||||
cookies = parse_cookies(v->value);
|
||||
}
|
||||
}
|
||||
return cookies;
|
||||
}
|
||||
|
||||
/*! Limit the number of request headers in case the sender is being ridiculous. */
|
||||
#define MAX_HTTP_REQUEST_HEADERS 100
|
||||
|
||||
static void *httpd_helper_thread(void *data)
|
||||
{
|
||||
@@ -865,6 +862,7 @@ static void *httpd_helper_thread(void *data)
|
||||
struct ast_variable *tail = headers;
|
||||
char *uri, *method;
|
||||
enum ast_http_method http_method = AST_HTTP_UNKNOWN;
|
||||
int remaining_headers;
|
||||
|
||||
if (ast_atomic_fetchadd_int(&session_count, +1) >= session_limit) {
|
||||
goto done;
|
||||
@@ -899,9 +897,13 @@ static void *httpd_helper_thread(void *data)
|
||||
if (*c) {
|
||||
*c = '\0';
|
||||
}
|
||||
} else {
|
||||
ast_http_error(ser, 400, "Bad Request", "Invalid Request");
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* process "Request Headers" lines */
|
||||
remaining_headers = MAX_HTTP_REQUEST_HEADERS;
|
||||
while (fgets(header_line, sizeof(header_line), ser->f)) {
|
||||
char *name, *value;
|
||||
|
||||
@@ -924,6 +926,11 @@ static void *httpd_helper_thread(void *data)
|
||||
|
||||
ast_trim_blanks(name);
|
||||
|
||||
if (!remaining_headers--) {
|
||||
/* Too many headers. */
|
||||
ast_http_error(ser, 413, "Request Entity Too Large", "Too many headers");
|
||||
goto done;
|
||||
}
|
||||
if (!headers) {
|
||||
headers = ast_variable_new(name, value, __FILE__);
|
||||
tail = headers;
|
||||
@@ -931,11 +938,17 @@ static void *httpd_helper_thread(void *data)
|
||||
tail->next = ast_variable_new(name, value, __FILE__);
|
||||
tail = tail->next;
|
||||
}
|
||||
}
|
||||
if (!tail) {
|
||||
/*
|
||||
* Variable allocation failure.
|
||||
* Try to make some room.
|
||||
*/
|
||||
ast_variables_destroy(headers);
|
||||
headers = NULL;
|
||||
|
||||
if (!*uri) {
|
||||
ast_http_error(ser, 400, "Bad Request", "Invalid Request");
|
||||
goto done;
|
||||
ast_http_error(ser, 500, "Server Error", "Out of memory");
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
handle_uri(ser, uri, http_method, headers);
|
||||
@@ -944,9 +957,7 @@ done:
|
||||
ast_atomic_fetchadd_int(&session_count, -1);
|
||||
|
||||
/* clean up all the header information */
|
||||
if (headers) {
|
||||
ast_variables_destroy(headers);
|
||||
}
|
||||
ast_variables_destroy(headers);
|
||||
|
||||
if (ser->f) {
|
||||
fclose(ser->f);
|
||||
|
@@ -678,7 +678,7 @@ static void ast_rtp_ice_add_cand(struct ast_rtp *rtp, unsigned comp_id, unsigned
|
||||
return;
|
||||
}
|
||||
|
||||
if (pj_ice_sess_add_cand(rtp->ice, comp_id, transport_id, type, local_pref, &foundation, addr, addr, rel_addr, addr_len, NULL) != PJ_SUCCESS) {
|
||||
if (pj_ice_sess_add_cand(rtp->ice, comp_id, transport_id, type, local_pref, &foundation, addr, base_addr, rel_addr, addr_len, NULL) != PJ_SUCCESS) {
|
||||
ao2_ref(candidate, -1);
|
||||
return;
|
||||
}
|
||||
@@ -1683,15 +1683,19 @@ static void rtp_add_candidates_to_ice(struct ast_rtp_instance *instance, struct
|
||||
}
|
||||
|
||||
/* If configured to use a STUN server to get our external mapped address do so */
|
||||
if (stunaddr.sin_addr.s_addr && ast_sockaddr_is_ipv4(addr)) {
|
||||
if (stunaddr.sin_addr.s_addr && ast_sockaddr_is_ipv4(addr) && count) {
|
||||
struct sockaddr_in answer;
|
||||
|
||||
if (!ast_stun_request(rtp->s, &stunaddr, NULL, &answer)) {
|
||||
if (!ast_stun_request(component == AST_RTP_ICE_COMPONENT_RTCP ? rtp->rtcp->s : rtp->s, &stunaddr, NULL, &answer)) {
|
||||
pj_sockaddr base;
|
||||
pj_str_t mapped = pj_str(ast_strdupa(ast_inet_ntoa(answer.sin_addr)));
|
||||
|
||||
/* Use the first local host candidate as the base */
|
||||
pj_sockaddr_cp(&base, &address[0]);
|
||||
|
||||
pj_sockaddr_init(pj_AF_INET(), &address[0], &mapped, ntohs(answer.sin_port));
|
||||
|
||||
ast_rtp_ice_add_cand(rtp, component, transport, PJ_ICE_CAND_TYPE_SRFLX, 65535, &address[0], &address[0],
|
||||
ast_rtp_ice_add_cand(rtp, component, transport, PJ_ICE_CAND_TYPE_SRFLX, 65535, &address[0], &base,
|
||||
NULL, pj_sockaddr_get_len(&address[0]));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user