qtype = g_quark_try_string (worker_type);
if (qtype != 0) {
wrk = rspamd_config_new_worker (cfg, NULL);
- wrk->options = ucl_object_ref (obj);
+ wrk->options = ucl_object_copy (obj);
wrk->worker = rspamd_get_worker_by_type (cfg, qtype);
if (wrk->worker == NULL) {
}
neigh = ucl_object_typed_new (UCL_OBJECT);
- ucl_object_insert_key (neigh, ucl_object_ref (hostval), "host", 0, false);
+ ucl_object_insert_key (neigh, ucl_object_copy (hostval), "host", 0, false);
if ((p = strrchr (ucl_object_tostring (hostval), ':')) != NULL) {
if (g_ascii_isdigit (p[1])) {
rspamd_worker_conf_dtor (struct rspamd_worker_conf *wcf)
{
if (wcf) {
- /* XXX: fix reload memory leak somehow */
- /* ucl_object_unref (wcf->options); */
+ ucl_object_unref (wcf->options);
g_queue_free (wcf->active_workers);
g_hash_table_unref (wcf->params);
g_slice_free1 (sizeof (*wcf), wcf);
re_class = v;
g_hash_table_iter_steal (&it);
g_hash_table_unref (re_class->re);
+
+ if (re_class->type_data) {
+ g_slice_free1 (re_class->type_len, re_class->type_data);
+ }
+
#ifdef WITH_HYPERSCAN
if (re_class->hs_db) {
hs_free_database (re_class->hs_db);
guint dns_retransmits;
GQueue *upstreams;
gboolean configured;
+ rspamd_mempool_t *pool;
ref_entry_t ref;
};
}
g_queue_free (ctx->upstreams);
+ rspamd_mempool_delete (ctx->pool);
g_slice_free1 (sizeof (*ctx), ctx);
}
ctx->dns_timeout = default_dns_timeout;
ctx->revive_jitter = default_revive_jitter;
ctx->revive_time = default_revive_time;
+ ctx->pool = rspamd_mempool_new (rspamd_mempool_suggest_size (),
+ "upstreams");
ctx->upstreams = g_queue_new ();
REF_INIT_RETAIN (ctx, rspamd_upstream_ctx_dtor);
if (!rspamd_parse_host_port_priority (str, &addrs,
&up->weight,
- &up->name, def_port, NULL)) {
+ &up->name, def_port, ups->ctx->pool)) {
+
g_slice_free1 (sizeof (*up), up);
return FALSE;
}
addr = g_ptr_array_index (addrs, i);
rspamd_upstream_add_addr (up, rspamd_inet_address_copy (addr));
}
-
- g_ptr_array_free (addrs, TRUE);
}
if (up->weight == 0 && ups->rot_alg == RSPAMD_UPSTREAM_MASTER_SLAVE) {