]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fixes session-timers=refuse not being enforced for *caller*
authorDavid Vossel <dvossel@digium.com>
Wed, 4 May 2011 13:40:41 +0000 (13:40 +0000)
committerDavid Vossel <dvossel@digium.com>
Wed, 4 May 2011 13:40:41 +0000 (13:40 +0000)
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)

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.2@316616 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index f8f034133163b90f70f292896f99a8a8985229e2..ce8637d8c15b7a0ae53162312e541d78ed8a7eea 100644 (file)
@@ -2657,7 +2657,7 @@ static int parse_session_expires(const char *p_hdrval, int *const p_interval, en
 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 void ts_ast_rtp_destroy(void *data)
 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 @@ static int transmit_invite(struct sip_pvt *p, int sipmethod, int sdp, int init)
        }
 
        /* 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 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                }
 
                /* 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 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                                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 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                }
 
                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 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                        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 @@ enum st_refresher st_get_refresher(struct sip_pvt *p)
 }
 
 
-/*! \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) {