[sr-dev] git:master:a34b3820: uac: proper handling of empty attribute for uacreg refresh

Daniel-Constantin Mierla miconda at gmail.com
Fri May 27 11:16:23 CEST 2016


Module: kamailio
Branch: master
Commit: a34b382002cf9efe13c913f547ffacec3bd7757f
URL: https://github.com/kamailio/kamailio/commit/a34b382002cf9efe13c913f547ffacec3bd7757f

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: 2016-05-27T11:16:08+02:00

uac: proper handling of empty attribute for uacreg refresh

- reg_db_set_attr() does a continue on empty value, but for this
  operation was not used inside a loop
- reported by Dmitri Savolainen, GH #643

---

Modified: modules/uac/uac_reg.c

---

Diff:  https://github.com/kamailio/kamailio/commit/a34b382002cf9efe13c913f547ffacec3bd7757f.diff
Patch: https://github.com/kamailio/kamailio/commit/a34b382002cf9efe13c913f547ffacec3bd7757f.patch

---

diff --git a/modules/uac/uac_reg.c b/modules/uac/uac_reg.c
index f8c30ca..41b03ac 100644
--- a/modules/uac/uac_reg.c
+++ b/modules/uac/uac_reg.c
@@ -1320,46 +1320,48 @@ int uac_reg_db_refresh(str *pl_uuid)
 		}
 	}
 
-	memset(&reg, 0, sizeof(reg_uac_t));;
-	i = 0;
-	/* check for NULL values ?!?! */
-	reg_db_set_attr(l_uuid, 0);
-	reg_db_set_attr(l_username, 1);
-	reg_db_set_attr(l_domain, 2);
-	reg_db_set_attr(r_username, 3);
-	reg_db_set_attr(r_domain, 4);
-	/* realm may be empty */
-	if(!VAL_NULL(&RES_ROWS(db_res)[i].values[5])) {
-		reg.realm.s = (char*)(RES_ROWS(db_res)[i].values[5].val.string_val);
-		reg.realm.len = strlen(reg.realm.s);
-	}
-	reg_db_set_attr(auth_username, 6);
-	reg_db_set_attr(auth_password, 7);
-	reg_db_set_attr(auth_proxy, 8);
-	reg.expires = (unsigned int)RES_ROWS(db_res)[i].values[9].val.int_val;
-	reg.h_uuid = reg_compute_hash(&reg.l_uuid);
-	reg.h_user = reg_compute_hash(&reg.l_username);
-	reg.flags = (unsigned int)RES_ROWS(db_res)[i].values[10].val.int_val;
-	reg.reg_delay = (unsigned int)RES_ROWS(db_res)[i].values[11].val.int_val;
-
-	lock_get(_reg_htable_gc_lock);
-	if(reg_ht_get_byuuid(pl_uuid)!=NULL)
-	{
-		if(reg_ht_update_attrs(&reg)<0)
-		{
-			lock_release(_reg_htable_gc_lock);
-			LM_ERR("Error updating reg to htable\n");
-			goto error;
+	memset(&reg, 0, sizeof(reg_uac_t));
+	/* only one record - use FOR to catch 'contunue' on invalid set attr */
+	for(i=0; i<1; i++) {
+		/* check for NULL values ?!?! */
+		reg_db_set_attr(l_uuid, 0);
+		reg_db_set_attr(l_username, 1);
+		reg_db_set_attr(l_domain, 2);
+		reg_db_set_attr(r_username, 3);
+		reg_db_set_attr(r_domain, 4);
+		/* realm may be empty */
+		if(!VAL_NULL(&RES_ROWS(db_res)[i].values[5])) {
+			reg.realm.s = (char*)(RES_ROWS(db_res)[i].values[5].val.string_val);
+			reg.realm.len = strlen(reg.realm.s);
 		}
-	} else {
-		if(reg_ht_add(&reg)<0)
+		reg_db_set_attr(auth_username, 6);
+		reg_db_set_attr(auth_password, 7);
+		reg_db_set_attr(auth_proxy, 8);
+		reg.expires = (unsigned int)RES_ROWS(db_res)[i].values[9].val.int_val;
+		reg.h_uuid = reg_compute_hash(&reg.l_uuid);
+		reg.h_user = reg_compute_hash(&reg.l_username);
+		reg.flags = (unsigned int)RES_ROWS(db_res)[i].values[10].val.int_val;
+		reg.reg_delay = (unsigned int)RES_ROWS(db_res)[i].values[11].val.int_val;
+
+		lock_get(_reg_htable_gc_lock);
+		if(reg_ht_get_byuuid(pl_uuid)!=NULL)
 		{
-			lock_release(_reg_htable_gc_lock);
-			LM_ERR("Error adding reg to htable\n");
-			goto error;
+			if(reg_ht_update_attrs(&reg)<0)
+			{
+				lock_release(_reg_htable_gc_lock);
+				LM_ERR("Error updating reg to htable\n");
+				goto error;
+			}
+		} else {
+			if(reg_ht_add(&reg)<0)
+			{
+				lock_release(_reg_htable_gc_lock);
+				LM_ERR("Error adding reg to htable\n");
+				goto error;
+			}
 		}
+		lock_release(_reg_htable_gc_lock);
 	}
-	lock_release(_reg_htable_gc_lock);
 
 	reg_dbf.free_result(reg_db_con, db_res);
 	reg_dbf.close(reg_db_con);




More information about the sr-dev mailing list