Compare commits

...

14 Commits

Author SHA1 Message Date
Asterisk Autobuilder
4c75ff9053 Importing release summary for 1.8.26.1 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.8.26.1@410669 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-17 14:11:59 +00:00
Asterisk Autobuilder
110a895d86 Importing release summary for 1.8.26.1 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.8.26.1@410440 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-10 18:25:34 +00:00
Asterisk Autobuilder
1b65ebd84f AST-2014-001: AST-2014-002: Merge into 1.8.26.1
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.8.26.1@410382 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-10 17:13:47 +00:00
Asterisk Autobuilder
0992371a8a Update version, remove old summaries
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.8.26.1@410377 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-10 16:46:25 +00:00
Asterisk Autobuilder
b52c4d45f0 Create 1.8.26.1
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.8.26.1@410372 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-10 16:35:09 +00:00
Asterisk Autobuilder
1ae9a13476 Importing release summary for 1.8.26.0 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.8.26.0@409419 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-03 12:32:32 +00:00
Asterisk Autobuilder
a9370279cd Update ChangeLog
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.8.26.0@409416 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-03 12:28:57 +00:00
Asterisk Autobuilder
4c39bee42c Update .version, remove old summaries
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.8.26.0@409415 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-03 12:27:42 +00:00
Asterisk Autobuilder
13b6ad6d92 Create 1.8.26.0
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.8.26.0@409412 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-03-03 12:21:37 +00:00
Asterisk Autobuilder
0003d9d78d Importing release summary for 1.8.26.0-rc1 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.8.26.0-rc1@405638 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-01-15 19:21:35 +00:00
Asterisk Autobuilder
d65658d54b Use autotagged externals
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.8.26.0-rc1@405530 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-01-14 19:33:36 +00:00
Asterisk Autobuilder
c7ccc00299 Importing release summary for 1.8.26.0-rc1 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.8.26.0-rc1@405529 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-01-14 19:33:25 +00:00
Asterisk Autobuilder
c324018484 Importing files for 1.8.26.0-rc1 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.8.26.0-rc1@405528 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-01-14 19:33:18 +00:00
Asterisk Autobuilder
9d4ba1bc49 Creating tag for the release of asterisk-1.8.26.0-rc1
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/1.8.26.0-rc1@405527 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2014-01-14 19:31:09 +00:00
7 changed files with 47576 additions and 162 deletions

1
.lastclean Normal file
View File

@@ -0,0 +1 @@
40

1
.version Normal file
View File

@@ -0,0 +1 @@
1.8.26.1

47219
ChangeLog Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,66 @@
<!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-1.8.26.1</title></head>
<body>
<h1 align="center"><a name="top">Release Summary</a></h1>
<h3 align="center">asterisk-1.8.26.1</h3>
<h3 align="center">Date: 2014-03-17</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-1.8.26.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>
4 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/1.8.26.1?view=revision&revision=410372">410372</a></td><td>bebuild</td><td>Create 1.8.26.1</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/tags/1.8.26.1?view=revision&revision=410377">410377</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/1.8.26.1?view=revision&revision=410382">410382</a></td><td>bebuild</td><td>AST-2014-001: AST-2014-002: Merge into 1.8.26.1</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/tags/1.8.26.1?view=revision&revision=410440">410440</a></td><td>bebuild</td><td>Importing release summary for 1.8.26.1 release.</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-1.8.26.0-summary.html | 336 ---------------------------------
asterisk-1.8.26.0-summary.txt | 406 -----------------------------------------
asterisk-1.8.26.1-summary.html | 63 ++++++
asterisk-1.8.26.1-summary.txt | 94 +++++++++
channels/chan_sip.c | 303 ++++++++++++++++--------------
main/http.c | 49 +++-
8 files changed, 377 insertions(+), 905 deletions(-)
</pre><br/>
<hr/>
</body>
</html>

View File

@@ -0,0 +1,99 @@
Release Summary
asterisk-1.8.26.1
Date: 2014-03-17
<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-1.8.26.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
4 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 |
|----------+---------+-------------------------------+-------------------|
| 410372 | bebuild | Create 1.8.26.1 | |
|----------+---------+-------------------------------+-------------------|
| 410377 | bebuild | Update version, remove old | |
| | | summaries | |
|----------+---------+-------------------------------+-------------------|
| 410382 | bebuild | AST-2014-001: AST-2014-002: | |
| | | Merge into 1.8.26.1 | |
|----------+---------+-------------------------------+-------------------|
| 410440 | bebuild | Importing release summary for | |
| | | 1.8.26.1 release. | |
+------------------------------------------------------------------------+
----------------------------------------------------------------------
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-1.8.26.0-summary.html | 336 ---------------------------------
asterisk-1.8.26.0-summary.txt | 406 -----------------------------------------
asterisk-1.8.26.1-summary.html | 63 ++++++
asterisk-1.8.26.1-summary.txt | 94 +++++++++
channels/chan_sip.c | 303 ++++++++++++++++--------------
main/http.c | 49 +++-
8 files changed, 377 insertions(+), 905 deletions(-)
----------------------------------------------------------------------

View File

@@ -23012,6 +23012,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 = 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 = 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
@@ -23031,19 +23170,9 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
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];
@@ -23529,6 +23658,14 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
/* 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 = -1;
goto request_invite_cleanup;
}
/* First invitation - create the channel. Allocation
* failures are handled below. */
c = sip_new(p, AST_STATE_DOWN, S_OR(p->peername, NULL), NULL);
@@ -23561,6 +23698,16 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
}
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 = -1;
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) {
@@ -23569,140 +23716,10 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
ast_party_redirecting_free(&redirecting);
}
/* 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 = 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 = -1;
goto request_invite_cleanup;
}
}
/* Parse the Min-SE header */
p_uac_min_se = 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 = -1;
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 = -1;
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 = -1;
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

@@ -187,9 +187,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;
}
@@ -824,12 +822,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;
@@ -859,21 +858,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)
{
@@ -884,6 +881,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;
@@ -918,9 +916,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;
@@ -943,6 +945,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;
@@ -950,11 +957,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);
@@ -963,9 +976,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);