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

Author: Alex Hermann <[email protected]>
Committer: Alex Hermann <[email protected]>
Date:   Tue Sep  6 10:18:10 2011 +0200

lib/srdb1: eleminate string copy in db_val2pv_spec()

After fixing a memory leak, i now realize pv_set_spec_value() always makes
a string copy too, so this one can be removed safely.

---

 lib/srdb1/db_ut.c |   52 +++++++++-------------------------------------------
 1 files changed, 9 insertions(+), 43 deletions(-)

diff --git a/lib/srdb1/db_ut.c b/lib/srdb1/db_ut.c
index babe0e7..840c861 100644
--- a/lib/srdb1/db_ut.c
+++ b/lib/srdb1/db_ut.c
@@ -407,8 +407,7 @@ int db_print_set(const db1_con_t* _c, char* _b, const int 
_l, const db_key_t* _k
 int db_val2pv_spec(struct sip_msg* msg, db_val_t *dbval, pv_spec_t *pvs)
 {
        pv_value_t pv;
-       str sv = {NULL, 0};
-       static str _str_empty = { "", 0 };
+       char ll_buf[21];  /* sign, 19 digits and \0 */
 
        if(dbval->nul)
        {
@@ -419,18 +418,18 @@ int db_val2pv_spec(struct sip_msg* msg, db_val_t *dbval, 
pv_spec_t *pvs)
                {
                        case DB1_STRING:
                                pv.flags = PV_VAL_STR;
-                               sv.s = (char*)dbval->val.string_val;
-                               sv.len = strlen(sv.s);
+                               pv.rs.s = (char*)dbval->val.string_val;
+                               pv.rs.len = strlen(pv.rs.s);
                        break;
                        case DB1_STR:
                                pv.flags = PV_VAL_STR;
-                               sv.s = (char*)dbval->val.str_val.s;
-                               sv.len = dbval->val.str_val.len;
+                               pv.rs.s = (char*)dbval->val.str_val.s;
+                               pv.rs.len = dbval->val.str_val.len;
                        break;
                        case DB1_BLOB:
                                pv.flags = PV_VAL_STR;
-                               sv.s = (char*)dbval->val.blob_val.s;
-                               sv.len = dbval->val.blob_val.len;
+                               pv.rs.s = (char*)dbval->val.blob_val.s;
+                               pv.rs.len = dbval->val.blob_val.len;
                        break;
                        case DB1_INT:
                                pv.flags = PV_VAL_INT | PV_TYPE_INT;
@@ -447,14 +446,8 @@ int db_val2pv_spec(struct sip_msg* msg, db_val_t *dbval, 
pv_spec_t *pvs)
                        case DB1_BIGINT:
                                /* BIGINT is stored as string */
                                pv.flags = PV_VAL_STR;
-                               pv.rs.len = 21*sizeof(char);
-                               pv.rs.s = (char*)pkg_malloc(pv.rs.len);
-                               if (pv.rs.s==NULL)
-                               {
-                                       LM_ERR("no more memory\n");
-                                       return -1;
-                               }
-                               db_longlong2str(dbval->val.ll_val, pv.rs.s, 
&pv.rs.len);
+                               db_longlong2str(dbval->val.ll_val, ll_buf, 
&pv.rs.len);
+                               pv.rs.s = ll_buf;
                        break;
                        default:
                                LM_NOTICE("unknown field type: %d, setting 
value to null\n",
@@ -467,39 +460,12 @@ int db_val2pv_spec(struct sip_msg* msg, db_val_t *dbval, 
pv_spec_t *pvs)
        if (pv.flags == PV_VAL_NULL && pvs->type == PVT_AVP)
                return 0;
 
-       /* handle string values */
-       if(pv.flags == PV_VAL_STR && sv.s)
-       {
-               if(sv.len==0)
-               {
-                       pv.rs = _str_empty;
-               } else
-               {
-                       /* create copy of string value in pkg mem */
-                       pv.rs.s = (char*)pkg_malloc(sv.len*sizeof(char));
-                       if(pv.rs.s==NULL)
-                       {
-                               LM_ERR("no more memory\n");
-                               return -1;
-                       }
-                       memcpy(pv.rs.s, sv.s, sv.len);
-                       pv.rs.len = sv.len;
-               }
-       }
-
        /* add value to result pv */
        if (pv_set_spec_value(msg, pvs, 0, &pv) != 0)
        {
                LM_ERR("Failed to add value to spec\n");
-               if (pv.flags == PV_VAL_STR && pv.rs.len > 0)
-                       pkg_free(pv.rs.s);
                return -1;
        }
 
-       /* free string memory */
-       if (pv.flags == PV_VAL_STR && pv.rs.len > 0) {
-               pkg_free(pv.rs.s);
-       }
-
        return 0;
 }


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to