diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2025-02-12 13:46:43 -0500 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2025-02-12 13:46:43 -0500 |
commit | 75c46e42dd881a7f101560f23bd1b4c6a4e45cad (patch) | |
tree | 08e3fe413afc685d27353ec89845c6eab2f45c5c | |
parent | 89bd28eb5ac263d1753021f25e1bc62f48e7008d (diff) | |
download | stasis-75c46e42dd881a7f101560f23bd1b4c6a4e45cad.tar.gz |
Fix upstream file clobberingfix-parallel-clobbering
* When --overwrite is enabled and the delivery meta.rc is >1, stasis would download all files related to a delivery from the server
* This change only downloads files relevant to the arch/platform of the current host system.
* Addresses several memory leaks found in the delivery_series_sync function
-rw-r--r-- | src/lib/delivery/delivery_artifactory.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/lib/delivery/delivery_artifactory.c b/src/lib/delivery/delivery_artifactory.c index e979b9a..97db752 100644 --- a/src/lib/delivery/delivery_artifactory.c +++ b/src/lib/delivery/delivery_artifactory.c @@ -193,11 +193,41 @@ int delivery_series_sync(struct Delivery *ctx) { return -1; // error } + char *r_fmt = strdup(ctx->rules.release_fmt); + if (!r_fmt) { + SYSERROR("%s", "Unable to allocate bytes for release format string"); + return -1; + } + + // Replace revision formatters with wildcards + const char *to_wild[] = {"%r", "%R"}; + for (size_t i = 0; i < sizeof(to_wild) / sizeof(*to_wild); i++) { + const char *formatter = to_wild[i]; + if (replace_text(r_fmt, formatter, "*", 0) < 0) { + SYSERROR("Failed to replace '%s' in delivery format string", formatter); + return -1; + } + } + + char *release_pattern = NULL; + if (delivery_format_str(ctx, &release_pattern, r_fmt) < 0) { + SYSERROR("Unable to render delivery format string: %s", r_fmt); + guard_free(r_fmt); + return -1; + } + guard_free(r_fmt); + char *remote_dir = NULL; - if (asprintf(&remote_dir, "%s/%s/%s/(*)", globals.jfrog.repo, ctx->meta.mission, ctx->info.build_name) < 0) { + if (asprintf(&remote_dir, "%s/%s/%s/(*/*%s*)", + globals.jfrog.repo, + ctx->meta.mission, + ctx->info.build_name, + release_pattern) < 0) { SYSERROR("%s", "Unable to allocate bytes for remote directory path"); + guard_free(release_pattern); return -1; } + guard_free(release_pattern); char *dest_dir = NULL; if (asprintf(&dest_dir, "%s/{1}", ctx->storage.output_dir) < 0) { @@ -205,5 +235,8 @@ int delivery_series_sync(struct Delivery *ctx) { return -1; } - return jfrog_cli_rt_download(&ctx->deploy.jfrog_auth, &dl, remote_dir, dest_dir); + int status = jfrog_cli_rt_download(&ctx->deploy.jfrog_auth, &dl, remote_dir, dest_dir); + guard_free(dest_dir); + guard_free(remote_dir); + return status; } |