From 5a9e00e56e3bacefbfa52d9e099e195069fd50fb Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 19 Oct 2020 12:36:10 +0100 Subject: [Minor] Switch to buffered IO + fix memory leak on reload --- src/libserver/dynamic_cfg.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/libserver/dynamic_cfg.c b/src/libserver/dynamic_cfg.c index e3ec39107..ab59b38dc 100644 --- a/src/libserver/dynamic_cfg.c +++ b/src/libserver/dynamic_cfg.c @@ -340,10 +340,17 @@ dump_dynamic_config (struct rspamd_config *cfg) return FALSE; } + struct ucl_emitter_functions *emitter_functions; + FILE *fp; + + fp = fdopen (fd, "w"); + emitter_functions = ucl_object_emit_file_funcs (fp); + if (!ucl_object_emit_full (cfg->current_dynamic_conf, UCL_EMIT_JSON, - ucl_object_emit_fd_funcs (fd), NULL)) { + emitter_functions, NULL)) { msg_err ("cannot emit ucl object: %s", strerror (errno)); - close (fd); + ucl_object_emit_funcs_free (emitter_functions); + fclose (fp); return FALSE; } @@ -352,8 +359,10 @@ dump_dynamic_config (struct rspamd_config *cfg) /* Rename old config */ if (rename (pathbuf, cfg->dynamic_conf) == -1) { msg_err ("rename error: %s", strerror (errno)); - close (fd); + fclose (fp); + ucl_object_emit_funcs_free (emitter_functions); unlink (pathbuf); + return FALSE; } /* Set permissions */ @@ -362,7 +371,9 @@ dump_dynamic_config (struct rspamd_config *cfg) msg_warn ("chmod failed: %s", strerror (errno)); } - close (fd); + fclose (fp); + ucl_object_emit_funcs_free (emitter_functions); + return TRUE; } -- cgit v1.2.3