]> git.ipfire.org Git - people/stevee/pakfire.git/commitdiff
util: Make pakfire_format_size write to stack
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 11 Apr 2021 12:44:56 +0000 (12:44 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 11 Apr 2021 12:44:56 +0000 (12:44 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/util.h
src/libpakfire/package.c
src/libpakfire/transaction.c
src/libpakfire/util.c

index 0da4bd4c6e69fcdef7046545eb9fc74f77c767cd..c46bf9bbd0ba6fe98a9f930dbc278df859b59a4e 100644 (file)
@@ -39,7 +39,7 @@ int pakfire_string_partition(const char* s, const char* delim, char** s1, char**
 char* pakfire_string_replace(const char* s, const char* pattern, const char* repl);
 char** pakfire_split_string(const char* s, char delim);
 
-char* pakfire_format_size(double size);
+int pakfire_format_size(char* dst, size_t length, double value);
 char* pakfire_format_date(time_t t);
 
 int pakfire_path_exists(const char* path);
index a44ee8e8a3d2db7783e082e69194c2c13b7c4bb7..fbfd89585a94c12f11f763eeb336cedd040d0d2b 100644 (file)
@@ -751,12 +751,10 @@ static void pakfire_package_dump_add_line_relations(char** str, const char* key,
 }
 
 static void pakfire_package_dump_add_line_size(char** str, const char* key, unsigned long long size) {
-       char* val = pakfire_format_size(size);
+       char buffer[128];
+       pakfire_format_size(buffer, sizeof(buffer) - 1, size);
 
-       if (val) {
-               pakfire_package_dump_add_line(str, key, val);
-               free(val);
-       }
+       pakfire_package_dump_add_line(str, key, buffer);
 }
 
 PAKFIRE_EXPORT char* pakfire_package_dump(PakfirePackage pkg, int flags) {
index 83ed289e0afb662efc2fb5c3f8dc97c9f67554e6..c127ff52f3268f16c7f7a8fd0b77ee5869174870 100644 (file)
@@ -231,21 +231,22 @@ static void pakfire_transaction_add_line(char** str, size_t width, const char* n
 }
 
 static void pakfire_transaction_add_package(char** str, size_t width, PakfirePackage pkg) {
+       char size[128];
+
        PakfireRepo repo = pakfire_package_get_repo(pkg);
 
-       unsigned long long size = pakfire_package_get_size(pkg);
-       char* size_str = pakfire_format_size(size);
+       // Format size
+       pakfire_format_size(size, sizeof(size) - 1, pakfire_package_get_size(pkg));
 
        pakfire_transaction_add_line(str, width,
                pakfire_package_get_name(pkg),
                pakfire_package_get_arch(pkg),
                pakfire_package_get_evr(pkg),
                pakfire_repo_get_name(repo),
-               size_str
+               size
        );
 
        pakfire_repo_unref(repo);
-       free(size_str);
 }
 
 static void pakfire_transaction_add_separator(char** str, size_t width) {
@@ -290,11 +291,10 @@ static void pakfire_transaction_add_summary_line(char** str, size_t width, const
 }
 
 static void pakfire_transaction_add_usage_line(char** str, size_t width, const char* headline, ssize_t size) {
-       char* s = pakfire_format_size(size);
-
-       asprintf(str, "%s%-21s: %s\n", *str, headline, s);
+       char buffer[128];
+       pakfire_format_size(buffer, sizeof(buffer) - 1, size);
 
-       free(s);
+       asprintf(str, "%s%-21s: %s\n", *str, headline, buffer);
 }
 
 PAKFIRE_EXPORT char* pakfire_transaction_dump(PakfireTransaction transaction, size_t width) {
index d5b596a2c5c99ba172086da3bd88b3e26d133f2b..6d199e1badb6ca1eb49f5500c9525f4eac475a0b 100644 (file)
@@ -226,19 +226,16 @@ char** pakfire_split_string(const char* s, char delim) {
        return ret;
 }
 
-char* pakfire_format_size(double size) {
-       char string[128];
+int pakfire_format_size(char* dst, size_t length, double value) {
        const char* units[] = {" ", "k", "M", "G", "T", NULL};
        const char** unit = units;
 
-       while (*(unit + 1) && size >= 1024.0) {
-               size /= 1024.0;
+       while (*(unit + 1) && value >= 1024.0) {
+               value /= 1024.0;
                unit++;
        }
 
-       snprintf(string, sizeof(string) - 1, "%.0f%s", round(size), *unit);
-
-       return strdup(string);
+       return snprintf(dst, length, "%.0f%s", round(value), *unit);
 }
 
 #pragma GCC diagnostic push