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

Author: Charles Chance <[email protected]>
Committer: Charles Chance <[email protected]>
Date: 2019-02-21T19:27:32Z

htable: fix infinite loop during dmq sync of large tables

- reported by Enrico Bandiera (GH #1863)

---

Modified: src/modules/htable/ht_dmq.c

---

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

---

diff --git a/src/modules/htable/ht_dmq.c b/src/modules/htable/ht_dmq.c
index 986c2c769a..1f27e97684 100644
--- a/src/modules/htable/ht_dmq.c
+++ b/src/modules/htable/ht_dmq.c
@@ -139,36 +139,43 @@ static int ht_dmq_cell_group_flush(dmq_node_t* node) {
 
        srjson_doc_t *jdoc = &ht_dmq_jdoc_cell_group.jdoc;
        srjson_t *jdoc_cells = ht_dmq_jdoc_cell_group.jdoc_cells;
+       int ret = 0;
 
        srjson_AddItemToObject(jdoc, jdoc->root, "cells", jdoc_cells);
 
-       LM_DBG("json[%s]\n", srjson_PrintUnformatted(jdoc, jdoc->root));
+       LM_DBG("jdoc size[%d]\n", ht_dmq_jdoc_cell_group.size);
        jdoc->buf.s = srjson_PrintUnformatted(jdoc, jdoc->root);
        if(jdoc->buf.s==NULL) {
                LM_ERR("unable to serialize data\n");
-               return -1;
+               ret = -1;
+               goto cleanup;
        }
        jdoc->buf.len = strlen(jdoc->buf.s);
 
        LM_DBG("sending serialized data %.*s\n", jdoc->buf.len, jdoc->buf.s);
        if (ht_dmq_send(&jdoc->buf, node)!=0) {
                LM_ERR("unable to send data\n");
-               return -1;
+               ret = -1;
        }
 
-       LM_DBG("jdoc size[%d]\n", ht_dmq_jdoc_cell_group.size);
+cleanup:
+
+       srjson_DeleteItemFromObject(jdoc, jdoc->root, "cells");
+       ht_dmq_jdoc_cell_group.count = 0;
+       ht_dmq_jdoc_cell_group.size = dmq_cell_group_empty_size;
+
+       if(jdoc->buf.s!=NULL) {
+               jdoc->free_fn(jdoc->buf.s);
+               jdoc->buf.s = NULL;
+       }
 
-       srjson_Delete(jdoc, jdoc_cells);
        ht_dmq_jdoc_cell_group.jdoc_cells = 
srjson_CreateArray(&ht_dmq_jdoc_cell_group.jdoc);
        if (ht_dmq_jdoc_cell_group.jdoc_cells==NULL) {
                LM_ERR("cannot re-create json cells array! \n");
-               return -1;
+               ret = -1;
        }
 
-       ht_dmq_jdoc_cell_group.count = 0;
-       ht_dmq_jdoc_cell_group.size = dmq_cell_group_empty_size;
-
-       return 0;
+       return ret;
 }
 
 static void ht_dmq_cell_group_destroy() {


_______________________________________________
Kamailio (SER) - Development Mailing List
[email protected]
https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to