]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
chan_iax2: Fix saving the wrong expiry time in astdb.
authorRichard Mudgett <rmudgett@digium.com>
Mon, 16 Sep 2013 16:42:35 +0000 (16:42 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Mon, 16 Sep 2013 16:42:35 +0000 (16:42 +0000)
When a new IAX2 client registers, the astdb database is updated with the
value of minregexpire defined in iax.conf instead of using the expiry time
that is provided by the client.  The provided expiry time of the client is
updated after inserting the astdb entry.  As a consequence, restarting or
reloading asterisk creates clients whose registration may expire before
they reregister.  The clients are therefore unavailable after minregexpire
seconds until they reregister.

* Move updating of the expiry time to before inserting into the astdb.

(closes issue ASTERISK-22504)
Reported by: Stefan Wachtler
Patches:
      chan_iax2.c.patch (license #6533) patch uploaded by Stefan Wachtler
........

Merged revisions 399158 from http://svn.asterisk.org/svn/asterisk/branches/1.8

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

channels/chan_iax2.c

index ef8cae8b436a090a8e7232132396cc7c20596cf0..d185f1ad5f530ed6b222caad612723ae6254c028 100644 (file)
@@ -8838,6 +8838,22 @@ static int update_registry(struct sockaddr_in *sin, int callno, char *devtype, i
                }
        }
 
+       /* treat an unspecified refresh interval as the minimum */
+       if (!refresh) {
+               refresh = min_reg_expire;
+       }
+       if (refresh > max_reg_expire) {
+               ast_log(LOG_NOTICE, "Restricting registration for peer '%s' to %d seconds (requested %d)\n",
+                       p->name, max_reg_expire, refresh);
+               p->expiry = max_reg_expire;
+       } else if (refresh < min_reg_expire) {
+               ast_log(LOG_NOTICE, "Restricting registration for peer '%s' to %d seconds (requested %d)\n",
+                       p->name, min_reg_expire, refresh);
+               p->expiry = min_reg_expire;
+       } else {
+               p->expiry = refresh;
+       }
+
        if (ast_sockaddr_cmp(&p->addr, &sockaddr)) {
                if (iax2_regfunk) {
                        iax2_regfunk(p->name, 1);
@@ -8890,20 +8906,7 @@ static int update_registry(struct sockaddr_in *sin, int callno, char *devtype, i
                        peer_unref(p);
                }
        }
-       /* treat an unspecified refresh interval as the minimum */
-       if (!refresh)
-               refresh = min_reg_expire;
-       if (refresh > max_reg_expire) {
-               ast_log(LOG_NOTICE, "Restricting registration for peer '%s' to %d seconds (requested %d)\n",
-                       p->name, max_reg_expire, refresh);
-               p->expiry = max_reg_expire;
-       } else if (refresh < min_reg_expire) {
-               ast_log(LOG_NOTICE, "Restricting registration for peer '%s' to %d seconds (requested %d)\n",
-                       p->name, min_reg_expire, refresh);
-               p->expiry = min_reg_expire;
-       } else {
-               p->expiry = refresh;
-       }
+
        if (p->expiry && sin->sin_addr.s_addr) {
                p->expire = iax2_sched_add(sched, (p->expiry + 10) * 1000, expire_registry, peer_ref(p));
                if (p->expire == -1)