]> git.ipfire.org Git - pakfire.git/commitdiff
strings: Have pakfire_string_format_interval write to a preallocated buffer
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 22 Feb 2025 17:20:43 +0000 (17:20 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 22 Feb 2025 17:20:43 +0000 (17:20 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/pakfire/repo.c
src/pakfire/string.c
src/pakfire/string.h
tests/libpakfire/string.c

index 1e7e2be2b5752da62baffad1983305216fc0d3f9..3046596f18ea4b6acd9b9b1b867dcb99f46b8cc7 100644 (file)
@@ -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
index 6db0cf63f5b548679b3b458b72c5f15000fdb8e6..17e65f35fd0330df6ff35f2f24525c255b275047 100644 (file)
@@ -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) {
index 7f96dd9f8eeca11ba60e7582195c08b2a4d3b928..45875f43c5020c85114da9cb2294ed99aee1123c 100644 (file)
@@ -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);
index f569833fda5a794ace1c73f23ccc60a00e5d2427..32e79bd1daddfd11c7eb38bd81ddbb83f55feff4 100644 (file)
@@ -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;