diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2024-02-26 10:03:34 -0500 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2024-02-26 10:03:34 -0500 |
commit | 924c8e9ae1bf1780447180ae717467d1beefc8fa (patch) | |
tree | 1601eb673dbdfb30e910f06087b3418b4ee46286 | |
parent | fc187bccb5856b2d6dd3816fc69ffe0001aa615d (diff) | |
download | stasis-924c8e9ae1bf1780447180ae717467d1beefc8fa.tar.gz |
Fixes several memory leaks
-rw-r--r-- | src/conda.c | 4 | ||||
-rw-r--r-- | src/deliverable.c | 76 | ||||
-rw-r--r-- | src/ini.c | 1 | ||||
-rw-r--r-- | src/main.c | 10 | ||||
-rw-r--r-- | src/system.c | 2 | ||||
-rw-r--r-- | src/template.c | 1 |
6 files changed, 77 insertions, 17 deletions
diff --git a/src/conda.c b/src/conda.c index acec709..87b32d4 100644 --- a/src/conda.c +++ b/src/conda.c @@ -185,8 +185,12 @@ int conda_check_required() { } } if (found < (sizeof(tools) / sizeof(*tools)) - 1) { + guard_free(cmd_out) + guard_strlist_free(result) return 1; } + guard_free(cmd_out) + guard_strlist_free(result) } else { msg(OMC_MSG_ERROR | OMC_MSG_L2, "The base package requirement check could not be performed\n"); return 2; diff --git a/src/deliverable.c b/src/deliverable.c index 1860ee6..4be3e51 100644 --- a/src/deliverable.c +++ b/src/deliverable.c @@ -22,41 +22,61 @@ extern char **environ; } #define conv_int(X, DEST) X->DEST = val.as_int; + #define conv_str(X, DEST) { \ - char *tplop = tpl_render(runtime_expand_var(NULL, val.as_char_p)); \ + char *rtevnop = runtime_expand_var(NULL, val.as_char_p); \ + char *tplop = tpl_render(rtevnop); \ if (tplop) { \ X->DEST = tplop; \ } else { \ X->DEST = val.as_char_p; \ } \ + guard_free(rtevnop) \ } + #define conv_str_noexpand(X, DEST) if (val.as_char_p) X->DEST = strdup(val.as_char_p); + #define conv_strlist(X, DEST, TOK) { \ - char *rtevnop = tpl_render(runtime_expand_var(NULL, val.as_char_p)); \ + char *rtevnop = runtime_expand_var(NULL, val.as_char_p); \ + char *tplop = tpl_render(rtevnop); \ if (!X->DEST) \ X->DEST = strlist_init(); \ - if (rtevnop) { \ - strip(rtevnop); \ - strlist_append_tokenize(X->DEST, rtevnop, TOK); \ - guard_free(rtevnop) \ + if (tplop) { \ + strip(tplop); \ + strlist_append_tokenize(X->DEST, tplop, TOK); \ + guard_free(tplop) \ } else { \ rtevnop = NULL; \ } \ + guard_free(rtevnop) \ } + #define conv_bool(X, DEST) X->DEST = val.as_bool; -#define conv_str_stackvar(X, DEST) X.DEST = tpl_render(runtime_expand_var(NULL, val.as_char_p)); +#define conv_str_stackvar(X, DEST) { \ + char *rtevnop = runtime_expand_var(NULL, val.as_char_p); \ + char *tplop = tpl_render(rtevnop); \ + if (tplop) { \ + X.DEST = tplop; \ + } else { \ + X.DEST = val.as_char_p; \ + } \ + guard_free(rtevnop) \ +} + #define conv_strlist_stackvar(X, DEST, TOK) { \ - char *rtevnop = tpl_render(runtime_expand_var(NULL, val.as_char_p)); \ + char *rtevnop = runtime_expand_var(NULL, val.as_char_p); \ + char *tplop = tpl_render(rtevnop); \ if (!X.DEST) \ X.DEST = strlist_init(); \ - if (rtevnop) { \ - strip(rtevnop); \ - strlist_append_tokenize(X.DEST, rtevnop, TOK); \ - guard_free(rtevnop) \ + if (tplop) { \ + strip(tplop); \ + strlist_append_tokenize(X.DEST, tplop, TOK); \ + guard_free(tplop) \ } else { \ rtevnop = NULL; \ } \ + guard_free(rtevnop); \ } #define conv_bool_stackvar(X, DEST) X.DEST = val.as_bool; @@ -133,6 +153,7 @@ void delivery_free(struct Delivery *ctx) { guard_free(ctx->storage.tmpdir) guard_free(ctx->storage.delivery_dir) guard_free(ctx->storage.tools_dir) + guard_free(ctx->storage.package_dir) guard_free(ctx->storage.conda_install_prefix) guard_free(ctx->storage.conda_artifact_dir) guard_free(ctx->storage.conda_staging_dir) @@ -145,6 +166,10 @@ void delivery_free(struct Delivery *ctx) { guard_free(ctx->storage.build_sources_dir) guard_free(ctx->storage.build_testing_dir) guard_free(ctx->storage.mission_dir) + guard_free(ctx->info.time_str_epoch) + guard_free(ctx->info.build_name) + guard_free(ctx->info.build_number) + guard_free(ctx->info.release_name) guard_free(ctx->conda.installer_baseurl) guard_free(ctx->conda.installer_name) guard_free(ctx->conda.installer_version) @@ -161,11 +186,22 @@ void delivery_free(struct Delivery *ctx) { guard_free(ctx->tests[i].name) guard_free(ctx->tests[i].version) guard_free(ctx->tests[i].repository) + guard_free(ctx->tests[i].repository_info_ref) + guard_free(ctx->tests[i].repository_info_tag) guard_free(ctx->tests[i].script) guard_free(ctx->tests[i].build_recipe) // test-specific runtime variables guard_runtime_free(ctx->tests[i].runtime.environ) } + + guard_free(ctx->rules.release_fmt) + guard_free(ctx->rules.build_name_fmt) + guard_free(ctx->rules.build_number_fmt) + ini_free(&ctx->rules._handle); + + for (size_t i = 0; i < sizeof(ctx->tests) / sizeof(ctx->tests[0]); i++) { + guard_strlist_free(ctx->deploy[i].files) + } } void delivery_init_dirs(struct Delivery *ctx) { @@ -523,9 +559,6 @@ int delivery_init(struct Delivery *ctx, struct INIFILE *ini, struct INIFILE *cfg } } - char env_name[NAME_MAX]; - char env_date[NAME_MAX]; - /* if (!strcasecmp(ctx->meta.mission, "hst") && ctx->meta.final) { memset(env_date, 0, sizeof(env_date)); @@ -1217,6 +1250,7 @@ void delivery_rewrite_spec(struct Delivery *ctx, char *filename) { exit(1); } remove(tempfile); + guard_free(tempfile); // Replace "local" channel with the staging URL if (ctx->storage.conda_staging_url) { @@ -1322,7 +1356,15 @@ void delivery_tests_run(struct Delivery *ctx) { memset(cmd, 0, sizeof(cmd)); sprintf(cmd, "set -x ; %s", ctx->tests[i].script); - status = shell(&proc, tpl_render(cmd)); + char *cmd_rendered = tpl_render(cmd); + if (cmd_rendered) { + if (strcmp(cmd_rendered, cmd) != 0) { + strcpy(cmd, cmd_rendered); + } + guard_free(cmd_rendered) + } + + status = shell(&proc, cmd); if (status) { msg(OMC_MSG_ERROR, "Script failure: %s\n%s\n\nExit code: %d\n", ctx->tests[i].name, ctx->tests[i].script, status); COE_CHECK_ABORT(!globals.continue_on_error, "Test failure") @@ -1572,6 +1614,8 @@ int delivery_mission_render_files(struct Delivery *ctx) { guard_free(contents); } + guard_free(data.src) + guard_free(data.dest) return 0; } @@ -323,7 +323,6 @@ struct INIFILE *ini_open(const char *filename) { // no data, skip if (!reading_value && isempty(line)) { guard_free(value) - value = NULL; continue; } @@ -113,6 +113,15 @@ void globals_free() { guard_free(globals.conda_install_prefix) guard_strlist_free(globals.conda_packages) guard_strlist_free(globals.pip_packages) + guard_free(globals.sysconfdir) + guard_free(globals.jfrog.arch) + guard_free(globals.jfrog.os) + guard_free(globals.jfrog.repo) + guard_free(globals.jfrog.version) + guard_free(globals.jfrog.cli_major_ver) + guard_free(globals.jfrog.jfrog_artifactory_base_url) + guard_free(globals.jfrog.jfrog_artifactory_product) + guard_free(globals.jfrog.remote_filename) } int main(int argc, char *argv[], char *arge[]) { @@ -471,6 +480,7 @@ int main(int argc, char *argv[], char *arge[]) { delivery_free(&ctx); globals_free(); tpl_free(); + guard_free(config_input) msg(OMC_MSG_L1, "Done!\n"); return 0; diff --git a/src/system.c b/src/system.c index ea34717..154bd87 100644 --- a/src/system.c +++ b/src/system.c @@ -92,6 +92,8 @@ int shell(struct Process *proc, char *args) { if (proc != NULL) { proc->returncode = status; } + + guard_free(t_name) return WEXITSTATUS(status); } diff --git a/src/template.c b/src/template.c index ed40e8b..a272b8a 100644 --- a/src/template.c +++ b/src/template.c @@ -184,6 +184,7 @@ int tpl_render_to_file(char *str, const char *filename) { // Open the destination file for writing fp = fopen(filename, "w+"); if (!fp) { + guard_free(result) return -1; } |