Module: sip-router
Branch: master
Commit: b41f1a592a44ba9408070a9e1945b9e0503f59c7
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=b41f1a592a44ba9408070a9e1945b9e0503f59c7

Author: Jan Janak <j...@ryngle.com>
Committer: Jan Janak <j...@ryngle.com>
Date:   Mon Oct 26 16:25:02 2009 +0100

registrar: Fix handling of cases where contacts > max_contacts

Registrar should not report an error to syslog if a user exceeds the
maximum number of allowed contacts per user. The registrar module sends
a reply back with a description of what happened so there is no reason
to write this to syslog, max_contacts > 0 is a configuration choice
rather than an error.

This patch also changes all affected functions in registrar module to
indicate that the maximum number of allowed contacts was exceeded by
returning a positive number, instead of a negative number to indicate
that an error occurred.

---

 modules_s/registrar/save.c |   38 +++++++++++++++++++++-----------------
 1 files changed, 21 insertions(+), 17 deletions(-)

diff --git a/modules_s/registrar/save.c b/modules_s/registrar/save.c
index 27d134c..fee4548 100644
--- a/modules_s/registrar/save.c
+++ b/modules_s/registrar/save.c
@@ -257,10 +257,11 @@ static int create_rcv_uri(str** uri, struct sip_msg* m)
 
 
 /*
- * Message contained some contacts, but record with same address
- * of record was not found so we have to create a new record
- * and insert all contacts from the message that have expires
- * > 0
+ * Message contained some contacts, but record with same address of record was
+ * not found so we have to create a new record and insert all contacts from
+ * the message that have expires > 0. The function returns a negative number
+ * on error, a positive number if the number of contacts would exceed
+ * max_contacts and 0 on success.
  */
 static inline int insert(struct sip_msg* _m, str* aor, contact_t* _c, 
udomain_t* _d, str* _u, str *ua, str* aor_filter, int sid)
 {
@@ -289,7 +290,7 @@ static inline int insert(struct sip_msg* _m, str* aor, 
contact_t* _c, udomain_t*
                if (max_contacts && (num >= max_contacts)) {
                        rerrno = R_TOO_MANY;
                        ul.delete_urecord(_d, _u);
-                       return -1;
+                       return 1;
                }
                num++;
                
@@ -394,7 +395,7 @@ static int test_max_contacts(struct sip_msg* _m, urecord_t* 
_r, contact_t* _c)
                _c = get_next_contact(_c);
        }
        
-       DBG("test_max_contacts: %d contacts after commit\n", num);
+       DBG("test_max_contacts: %d contacts after commit, max_contacts=%d\n", 
num, max_contacts);
        if (num > max_contacts) {
                rerrno = R_TOO_MANY;
                return 1;
@@ -414,6 +415,11 @@ static int test_max_contacts(struct sip_msg* _m, 
urecord_t* _r, contact_t* _c)
  *    > 0, update the contact
  * 3) If contact in usrloc exists and expires
  *    == 0, delete contact
+ *
+ * The function returns a negative number on error, a positive number if
+ * max_contacts is set and the number of contacts after the change would
+ * exceed that maximum number of allowed contacts. On success the function
+ * returns 0.
  */
 static inline int update(struct sip_msg* _m, urecord_t* _r, str* aor, 
contact_t* _c, str* _ua, str* aor_filter, int sid)
 {
@@ -434,8 +440,12 @@ static inline int update(struct sip_msg* _m, urecord_t* 
_r, str* aor, contact_t*
        if (max_contacts) {
                ret = test_max_contacts(_m, _r, _c);
                if (ret != 0) {
+                       /* test_max_contacts returns a negative number on error 
and a
+                        * positive number if the number of contacts after the 
update
+                        * exceeds the configured max_contacts. In both cases 
we return
+                        * here. */
                        build_contact(_r->contacts, aor_filter);
-                       return -1;
+                       return ret;
                }
        }
 
@@ -607,24 +617,18 @@ static inline int contacts(struct sip_msg* _m, contact_t* 
_c, udomain_t* _d, str
        }
 
        if (res == 0) { /* Contacts found */
-               if (update(_m, r, aor, _c, _ua, aor_filter, sid) < 0) {
+               if ((res = update(_m, r, aor, _c, _ua, aor_filter, sid) < 0)) {
                        LOG(L_ERR, "contacts(): Error while updating record\n");
-                       build_contact(r->contacts, aor_filter);
-                       ul.release_urecord(r);
-                       ul.unlock_udomain(_d);
-                       return -3;
                }
                build_contact(r->contacts, aor_filter);
                ul.release_urecord(r);
        } else {
-               if (insert(_m, aor, _c, _d, _u, _ua, aor_filter, sid) < 0) {
+               if ((res = insert(_m, aor, _c, _d, _u, _ua, aor_filter, sid) < 
0)) {
                        LOG(L_ERR, "contacts(): Error while inserting 
record\n");
-                       ul.unlock_udomain(_d);
-                       return -4;
                }
        }
        ul.unlock_udomain(_d);
-       return 0;
+       return res;
 }
 
 #define UA_DUMMY_STR "Unknown"
@@ -684,7 +688,7 @@ static inline int save_real(struct sip_msg* _m, udomain_t* 
_t, char* aor_filt, i
                        if (no_contacts(_t, &uid, &aor_filter) < 0) goto error;
                }
        } else {
-               if (contacts(_m, c, _t, &uid, &ua, &aor_filter) < 0) goto error;
+               if (contacts(_m, c, _t, &uid, &ua, &aor_filter) != 0) goto 
error;
        }
 
        if (doreply) {


_______________________________________________
sr-dev mailing list
sr-dev@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to