Compare commits

...

20 Commits

Author SHA1 Message Date
Asterisk Autobuilder
a06b72ee1e Importing release summary for 11.8.1 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.1@410441 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-10 18:27:52 +00:00
Asterisk Autobuilder
8e6183f624 AST-2014-001: AST-2014-002: Merge into 11.8.1
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.1@410431 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-10 18:13:16 +00:00
Asterisk Autobuilder
13a9b7a6d9 Update version, remove old summaries
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.1@410378 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-10 16:46:44 +00:00
Asterisk Autobuilder
e41fd7b22f Create 11.8.1
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.1@410373 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-10 16:35:35 +00:00
Asterisk Autobuilder
61a50ebecf Importing release summary for 11.8.0 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0@409420 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-03 12:36:27 +00:00
Asterisk Autobuilder
e31d487b51 Update .version, remove old summaries, update ChangeLog
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0@409417 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-03 12:29:47 +00:00
Asterisk Autobuilder
9931fb4c73 Create 11.8.0
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0@409413 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-03 12:22:06 +00:00
Asterisk Autobuilder
2157c83db3 Importing release summary for 11.8.0-rc3 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0-rc3@409306 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-02 00:38:57 +00:00
Asterisk Autobuilder
e3c20131d8 Merge r409157 for 11.8.0-rc3
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0-rc3@409303 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-01 23:30:16 +00:00
Asterisk Autobuilder
dcfed79861 Update .version, remove old summaries
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0-rc3@409302 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-01 23:17:08 +00:00
Asterisk Autobuilder
8543e62278 Create 11.8.0-rc3
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0-rc3@409300 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-01 23:12:39 +00:00
Asterisk Autobuilder
930582391d Importing release summary for 11.8.0-rc2 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0-rc2@409154 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-02-27 22:25:03 +00:00
Asterisk Autobuilder
8660079629 res_rtp_asterisk: Fix checklist creatingh problems in ICE sessions
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0-rc2@409150 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-02-27 21:39:30 +00:00
Asterisk Autobuilder
e294ec5462 Remove old summaries, update version
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0-rc2@409146 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-02-27 20:22:52 +00:00
Asterisk Autobuilder
0401d7648f Create 11.8.0-rc2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0-rc2@409140 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-02-27 20:20:18 +00:00
Asterisk Autobuilder
c0cf363199 Importing release summary for 11.8.0-rc1 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0-rc1@405639 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-01-15 19:26:17 +00:00
Asterisk Autobuilder
2423658b06 Use autotagged externals
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0-rc1@405534 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-01-14 19:38:12 +00:00
Asterisk Autobuilder
fc053ad7a7 Importing release summary for 11.8.0-rc1 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0-rc1@405533 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-01-14 19:38:01 +00:00
Asterisk Autobuilder
e15a8a5066 Importing files for 11.8.0-rc1 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0-rc1@405532 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-01-14 19:37:48 +00:00
Asterisk Autobuilder
c6d2d98a91 Creating tag for the release of asterisk-11.8.0-rc1
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/11.8.0-rc1@405531 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-01-14 19:35:13 +00:00
8 changed files with 28739 additions and 168 deletions

1
.lastclean Normal file
View File

@@ -0,0 +1 @@
40

1
.version Normal file
View File

@@ -0,0 +1 @@
11.8.1

28378
ChangeLog Normal file

File diff suppressed because it is too large Load Diff

View 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">&lt;asteriskteam@digium.com&gt;</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>

View 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(-)
----------------------------------------------------------------------

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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]));
}
}