[asterisk-commits] dvossel: branch 1.6.2 r316616 - /branches/1.6.2/channels/chan_sip.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed May 4 08:40:49 CDT 2011
Author: dvossel
Date: Wed May 4 08:40:41 2011
New Revision: 316616
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=316616
Log:
Fixes session-timers=refuse not being enforced for *caller*
During handle_request_invite, the session timer mode was retrieved from
a cached variable. This patch forces a peer lookup of the session timer
mode in the case of an incoming invite.
(closes issue #18804)
Reported by: wdoekes
Patches:
issue18804_session_timer_refuse_caller.patch uploaded by wdoekes (license 717)
issue_18804_v2.diff uploaded by dvossel (license 671)
Modified:
branches/1.6.2/channels/chan_sip.c
Modified: branches/1.6.2/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.6.2/channels/chan_sip.c?view=diff&rev=316616&r1=316615&r2=316616
==============================================================================
--- branches/1.6.2/channels/chan_sip.c (original)
+++ branches/1.6.2/channels/chan_sip.c Wed May 4 08:40:41 2011
@@ -2657,7 +2657,7 @@
static int parse_minse(const char *p_hdrval, int *const p_interval);
static int st_get_se(struct sip_pvt *, int max);
static enum st_refresher st_get_refresher(struct sip_pvt *);
-static enum st_mode st_get_mode(struct sip_pvt *);
+static enum st_mode st_get_mode(struct sip_pvt *, int no_cached);
static struct sip_st_dlg* sip_st_alloc(struct sip_pvt *const p);
/*!--- SIP MWI Subscription support */
@@ -9473,7 +9473,7 @@
static int add_supported_header(struct sip_pvt *pvt, struct sip_request *req)
{
int res;
- if (st_get_mode(pvt) != SESSION_TIMER_MODE_REFUSE) {
+ if (st_get_mode(pvt, 0) != SESSION_TIMER_MODE_REFUSE) {
res = add_header(req, "Supported", "replaces, timer");
} else {
res = add_header(req, "Supported", "replaces");
@@ -11376,7 +11376,7 @@
}
/* Add Session-Timers related headers */
- if (st_get_mode(p) == SESSION_TIMER_MODE_ORIGINATE) {
+ if (st_get_mode(p, 0) == SESSION_TIMER_MODE_ORIGINATE) {
char i2astr[10];
if (!p->stimer->st_interval)
@@ -18311,7 +18311,7 @@
}
/* Check for Session-Timers related headers */
- if (st_get_mode(p) != SESSION_TIMER_MODE_REFUSE && p->outgoing_call == TRUE && !reinvite) {
+ if (st_get_mode(p, 0) != SESSION_TIMER_MODE_REFUSE && p->outgoing_call == TRUE && !reinvite) {
p_hdrval = (char*)get_header(req, "Session-Expires");
if (!ast_strlen_zero(p_hdrval)) {
/* UAS supports Session-Timers */
@@ -18333,7 +18333,7 @@
start_session_timer(p);
} else {
/* UAS doesn't support Session-Timers */
- if (st_get_mode(p) == SESSION_TIMER_MODE_ORIGINATE) {
+ if (st_get_mode(p, 0) == SESSION_TIMER_MODE_ORIGINATE) {
p->stimer->st_ref = SESSION_TIMER_REFRESHER_UAC;
p->stimer->st_active_peer_ua = FALSE;
start_session_timer(p);
@@ -20742,7 +20742,7 @@
}
dlg_min_se = st_get_se(p, FALSE);
- switch (st_get_mode(p)) {
+ 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) {
@@ -20788,14 +20788,14 @@
break;
default:
- ast_log(LOG_ERROR, "Internal Error %d at %s:%d\n", st_get_mode(p), __FILE__, __LINE__);
+ 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)) {
+ switch (st_get_mode(p, 1)) {
case SESSION_TIMER_MODE_ORIGINATE:
st_active = TRUE;
st_interval = st_get_se(p, TRUE);
@@ -23465,15 +23465,18 @@
}
-/*! \brief Get the session-timer mode
+/*!
+ * \brief Get the session-timer mode
* \param p pointer to the SIP dialog
+ * \param no_cached, set this to true in order to force a peername lookup on
+ * the session timer mode.
*/
-enum st_mode st_get_mode(struct sip_pvt *p)
+enum st_mode st_get_mode(struct sip_pvt *p, int no_cached)
{
if (!p->stimer)
sip_st_alloc(p);
- if (p->stimer->st_cached_mode != SESSION_TIMER_MODE_INVALID)
+ if (!no_cached && p->stimer->st_cached_mode != SESSION_TIMER_MODE_INVALID)
return p->stimer->st_cached_mode;
if (p->peername) {
More information about the asterisk-commits
mailing list