diff --git a/daemon/call.c b/daemon/call.c index 8ae975744..fb0efeab7 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -57,7 +57,6 @@ struct iterator_helper { }; struct xmlrpc_helper { enum xmlrpc_format fmt; - GStringChunk *c; GQueue strings; }; @@ -290,7 +289,7 @@ retry: pid = waitpid(pid, &status, 0); if ((pid > 0 && WIFEXITED(status) && WEXITSTATUS(status) == 0) || i >= 3) { for (int i = 0; i < els_per_ent; i++) - g_queue_pop_head(&xh->strings); + free(g_queue_pop_head(&xh->strings)); i = 0; } else { @@ -356,7 +355,7 @@ retry: xmlrpc_client_destroy(c); for (int i = 0; i < els_per_ent; i++) - g_queue_pop_head(&xh->strings); + free(g_queue_pop_head(&xh->strings)); xmlrpc_env_clean(&e); _exit(0); @@ -366,7 +365,6 @@ fault: _exit(1); } - g_string_chunk_free(xh->c); g_slice_free1(sizeof(*xh), xh); } @@ -374,7 +372,7 @@ void kill_calls_timer(GSList *list, const char *url) { struct call *ca; GList *csl; struct call_monologue *cm, *cd; - const char *url_prefix, *url_suffix; + char *url_prefix = NULL, *url_suffix = NULL; struct xmlrpc_helper *xh = NULL; char url_buf[128]; @@ -384,15 +382,14 @@ void kill_calls_timer(GSList *list, const char *url) { /* if url is NULL, it's the scheduled deletions, otherwise it's the timeouts */ if (url) { xh = g_slice_alloc(sizeof(*xh)); - xh->c = g_string_chunk_new(64); url_prefix = NULL; url_suffix = strstr(url, "%%"); if (url_suffix) { - url_prefix = g_string_chunk_insert_len(xh->c, url, url_suffix - url); - url_suffix = g_string_chunk_insert(xh->c, url_suffix + 2); + url_prefix = strndup(url, url_suffix - url); + url_suffix = strdup(url_suffix + 2); } else - url_suffix = g_string_chunk_insert(xh->c, url); + url_suffix = strdup(url); g_queue_init(&xh->strings); xh->fmt = rtpe_config.fmt; } @@ -430,13 +427,13 @@ void kill_calls_timer(GSList *list, const char *url) { cm = csl->data; if (!cm->tag.s || !cm->tag.len) continue; - g_queue_push_tail(&xh->strings, g_string_chunk_insert(xh->c, url_buf)); - g_queue_push_tail(&xh->strings, str_chunk_insert(xh->c, &cm->tag)); + g_queue_push_tail(&xh->strings, strdup(url_buf)); + g_queue_push_tail(&xh->strings, str_dup(&cm->tag)); } break; case XF_CALLID: - g_queue_push_tail(&xh->strings, g_string_chunk_insert(xh->c, url_buf)); - g_queue_push_tail(&xh->strings, str_chunk_insert(xh->c, &ca->callid)); + g_queue_push_tail(&xh->strings, strdup(url_buf)); + g_queue_push_tail(&xh->strings, str_dup(&ca->callid)); break; case XF_KAMAILIO: for (csl = ca->monologues.head; csl; csl = csl->next) { @@ -449,13 +446,13 @@ void kill_calls_timer(GSList *list, const char *url) { if (from_tag && !str_cmp_str(from_tag, &cm->tag)) continue; - from_tag = str_chunk_insert(xh->c, &cm->tag); - str *to_tag = str_chunk_insert(xh->c, &cd->tag); + from_tag = str_dup(&cm->tag); + str *to_tag = str_dup(&cd->tag); g_queue_push_tail(&xh->strings, - g_string_chunk_insert(xh->c, url_buf)); + strdup(url_buf)); g_queue_push_tail(&xh->strings, - str_chunk_insert(xh->c, &ca->callid)); + str_dup(&ca->callid)); g_queue_push_tail(&xh->strings, from_tag); g_queue_push_tail(&xh->strings, to_tag); @@ -479,6 +476,10 @@ destroy: if (xh) thread_create_detach_prio(xmlrpc_kill_calls, xh, rtpe_config.idle_scheduling, rtpe_config.idle_priority, "XMLRPC callback"); + if (url_prefix) + free(url_prefix); + if (url_suffix) + free(url_suffix); }