From f67259577d6e6acd6f9c204ec03ea00fc7ea6fe6 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 22 Feb 2025 17:20:43 +0000 Subject: [PATCH] strings: Have pakfire_string_format_interval write to a preallocated buffer Signed-off-by: Michael Tremer --- src/pakfire/repo.c | 17 +++++++++-------- src/pakfire/string.c | 19 +++++++++---------- src/pakfire/string.h | 5 ++++- tests/libpakfire/string.c | 27 ++++++++++++++++++--------- 4 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/pakfire/repo.c b/src/pakfire/repo.c index 1e7e2be2..3046596f 100644 --- a/src/pakfire/repo.c +++ b/src/pakfire/repo.c @@ -1728,6 +1728,7 @@ int pakfire_repo_write_config(struct pakfire_repo* repo, FILE* f) { struct pakfire_key* key = NULL; char* section = NULL; char* buffer = NULL; + char refresh[1024]; size_t length = 0; int r; @@ -1775,15 +1776,15 @@ int pakfire_repo_write_config(struct pakfire_repo* repo, FILE* f) { } // Refresh Interval - char* refresh = pakfire_string_format_interval(repo->appdata->refresh); - if (refresh) { - r = pakfire_config_set(config, section, "refresh", refresh); - free(refresh); + r = pakfire_string_format_interval(refresh, repo->appdata->refresh); + if (r < 0) + goto ERROR; - if (r < 0) { - ERROR(repo->ctx, "Could not set refresh interval: %s\n", strerror(-r)); - goto ERROR; - } + // Set the refresh interval + r = pakfire_config_set(config, section, "refresh", refresh); + if (r < 0) { + ERROR(repo->ctx, "Could not set refresh interval: %s\n", strerror(-r)); + goto ERROR; } // Mirror List diff --git a/src/pakfire/string.c b/src/pakfire/string.c index 6db0cf63..17e65f35 100644 --- a/src/pakfire/string.c +++ b/src/pakfire/string.c @@ -706,38 +706,37 @@ int __pakfire_timeval_to_iso8601(char* buffer, const size_t length, const struct US_TO_MS(t->tv_usec)); } -char* pakfire_string_format_interval(const time_t t) { - char* buffer = NULL; +int __pakfire_string_format_interval(char* buffer, size_t length, const time_t t) { int r; if (t < 0) - return NULL; + return -EINVAL; // Weeks else if (t >= 604800) - r = asprintf(&buffer, "%ldw", t / 604800); + r = __pakfire_string_format(buffer, length, "%ldw", t / 604800); // Days else if (t >= 86400) - r = asprintf(&buffer, "%ldd", t / 86400); + r = __pakfire_string_format(buffer, length, "%ldd", t / 86400); // Hours else if (t >= 3600) - r = asprintf(&buffer, "%ldh", t / 3600); + r = __pakfire_string_format(buffer, length, "%ldh", t / 3600); // Minutes else if (t >= 60) - r = asprintf(&buffer, "%ldm", t / 60); + r = __pakfire_string_format(buffer, length, "%ldm", t / 60); // Seconds else - r = asprintf(&buffer, "%lds", t); + r = __pakfire_string_format(buffer, length, "%lds", t); // Handle any errors if (r < 0) - return NULL; + return r; - return buffer; + return 0; } time_t pakfire_string_parse_interval(const char* buffer) { diff --git a/src/pakfire/string.h b/src/pakfire/string.h index 7f96dd9f..45875f43 100644 --- a/src/pakfire/string.h +++ b/src/pakfire/string.h @@ -146,7 +146,10 @@ int __pakfire_timeval_to_iso8601(char* buffer, const size_t length, const struct size_t pakfire_string_parse_bytes(const char* s); -char* pakfire_string_format_interval(const time_t t); +#define pakfire_string_format_interval(buffer, t) \ + __pakfire_string_format_interval(buffer, sizeof(buffer), t) +int __pakfire_string_format_interval(char* buffer, size_t length, const time_t t); + time_t pakfire_string_parse_interval(const char* buffer); int pakfire_string_is_url(const char* s); diff --git a/tests/libpakfire/string.c b/tests/libpakfire/string.c index f569833f..32e79bd1 100644 --- a/tests/libpakfire/string.c +++ b/tests/libpakfire/string.c @@ -360,6 +360,7 @@ FAIL: } static int test_intervals(const struct test* t) { + char buffer[1024]; int r = EXIT_FAILURE; // Parse @@ -384,17 +385,25 @@ static int test_intervals(const struct test* t) { ASSERT(pakfire_string_parse_interval("0abc") == -1); // Format - ASSERT_STRING_EQUALS(pakfire_string_format_interval(0), "0s"); - ASSERT_STRING_EQUALS(pakfire_string_format_interval(1), "1s"); - ASSERT_STRING_EQUALS(pakfire_string_format_interval(5), "5s"); - ASSERT_STRING_EQUALS(pakfire_string_format_interval(60), "1m"); - ASSERT_STRING_EQUALS(pakfire_string_format_interval(61), "1m"); - ASSERT_STRING_EQUALS(pakfire_string_format_interval(3600), "1h"); - ASSERT_STRING_EQUALS(pakfire_string_format_interval(86400), "1d"); - ASSERT_STRING_EQUALS(pakfire_string_format_interval(604800), "1w"); + ASSERT_SUCCESS(pakfire_string_format_interval(buffer, 0)); + ASSERT_STRING_EQUALS(buffer, "0s"); + ASSERT_SUCCESS(pakfire_string_format_interval(buffer, 1)); + ASSERT_STRING_EQUALS(buffer, "1s"); + ASSERT_SUCCESS(pakfire_string_format_interval(buffer, 5)); + ASSERT_STRING_EQUALS(buffer, "5s"); + ASSERT_SUCCESS(pakfire_string_format_interval(buffer, 60)); + ASSERT_STRING_EQUALS(buffer, "1m"); + ASSERT_SUCCESS(pakfire_string_format_interval(buffer, 61)); + ASSERT_STRING_EQUALS(buffer, "1m"); + ASSERT_SUCCESS(pakfire_string_format_interval(buffer, 3600)); + ASSERT_STRING_EQUALS(buffer, "1h"); + ASSERT_SUCCESS(pakfire_string_format_interval(buffer, 86400)); + ASSERT_STRING_EQUALS(buffer, "1d"); + ASSERT_SUCCESS(pakfire_string_format_interval(buffer, 604800)); + ASSERT_STRING_EQUALS(buffer, "1w"); // Invalid inputs - ASSERT(pakfire_string_format_interval(-1) == NULL); + ASSERT_ERROR(pakfire_string_format_interval(buffer, -1), EINVAL); // Everything passed r = EXIT_SUCCESS; -- 2.39.5