[asterisk-commits] dlee: branch 1.8 r380696 - /branches/1.8/channels/chan_sip.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Jan 31 13:56:20 CST 2013
Author: dlee
Date: Thu Jan 31 13:56:16 2013
New Revision: 380696
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=380696
Log:
Process session timers, even if Session-Expires header is missing
Previously, Asterisk only processed session timer information if both the
'Supported: timer' and 'Session-Expires' headers were present. However, the
Session-Expires header is optional. If we were to receive a request with a
Min-SE greater than our configured session-expires, we would respond with a
'Session-Expires' header that was too small.
This patch cleans the situation up a bit, always processing timer information
if the 'Supported: timer' header is present.
(closes issue ASTERISK-20787)
Reported by: Mark Michelson
Review: https://reviewboard.asterisk.org/r/2299/
Modified:
branches/1.8/channels/chan_sip.c
Modified: branches/1.8/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_sip.c?view=diff&rev=380696&r1=380695&r2=380696
==============================================================================
--- branches/1.8/channels/chan_sip.c (original)
+++ branches/1.8/channels/chan_sip.c Thu Jan 31 13:56:16 2013
@@ -23388,12 +23388,12 @@
}
/* Session-Timers */
- if ((p->sipoptions & SIP_OPT_TIMER) && !ast_strlen_zero(get_header(req, "Session-Expires"))) {
+ if ((p->sipoptions & SIP_OPT_TIMER)) {
enum st_refresher_param st_ref_param;
/* 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 and \"Session-Expires\" header.\n");
+ ast_debug(2, "Incoming INVITE with 'timer' option supported\n");
/* Allocate Session-Timers struct w/in the dialog */
if (!p->stimer)
@@ -23401,21 +23401,25 @@
/* Parse the Session-Expires header */
p_uac_se_hdr = get_header(req, "Session-Expires");
- 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;
+ 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);
@@ -23455,6 +23459,9 @@
} else {
st_interval = uac_max_se;
}
+ } else if (uac_min_se > 0) {
+ int dlg_max_se = st_get_se(p, TRUE);
+ st_interval = MAX(dlg_max_se, uac_min_se);
} else {
/* Set to default max value */
st_interval = global_max_se;
More information about the asterisk-commits
mailing list