]> git.ipfire.org Git - pakfire.git/commitdiff
packages: Copy strings when returning arrays
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 30 Aug 2023 16:30:34 +0000 (16:30 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 30 Aug 2023 16:30:34 +0000 (16:30 +0000)
This way, the return value will be owned by the caller which also has
the responsibility to clean it up.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/package.h
src/libpakfire/include/pakfire/util.h
src/libpakfire/package.c
src/libpakfire/util.c

index 1536a09c964d83bbc4e13434b93621311a6cbca5..fc3d5a8733329a4d22b75a24c61b05c4d1fb37b9 100644 (file)
@@ -98,7 +98,7 @@ int pakfire_package_set_string(struct pakfire_package* pkg,
        const enum pakfire_package_key key, const char* value);
 
 // String Arrays
-const char** pakfire_package_get_strings(struct pakfire_package* pkg,
+char** pakfire_package_get_strings(struct pakfire_package* pkg,
        const enum pakfire_package_key key);
 int pakfire_package_set_strings(struct pakfire_package* pkg,
        const enum pakfire_package_key key, const char** values);
index a2e48af1ec04b173901f49eea9b27df4264bd1c8..e5d32acd0e124834ce610f97809274a584635249 100644 (file)
@@ -110,7 +110,7 @@ int pakfire_json_add_string(struct pakfire* pakfire,
 int pakfire_json_add_integer(struct pakfire* pakfire,
        struct json_object* json, const char* name, int value);
 int pakfire_json_add_string_array(struct pakfire* pakfire,
-       struct json_object* json, const char* name, const char** array);
+       struct json_object* json, const char* name, char** array);
 
 // Resource Limits
 
index 0edd67477cc79ad9953e7a2427d302ebc4eb07b6..9f1cf2cd735ef1bab8cd9fb0173213f8ed8a7811 100644 (file)
@@ -574,9 +574,10 @@ PAKFIRE_EXPORT void pakfire_package_unset(struct pakfire_package* pkg,
        solvable_unset(s, id);
 }
 
-PAKFIRE_EXPORT const char** pakfire_package_get_strings(
+PAKFIRE_EXPORT char** pakfire_package_get_strings(
                struct pakfire_package* pkg, const enum pakfire_package_key key) {
-       const char** ret = NULL;
+       char** ret = NULL;
+       const char* str = NULL;
        Queue strings;
        Id id = ID_NULL;
 
@@ -608,8 +609,14 @@ PAKFIRE_EXPORT const char** pakfire_package_get_strings(
                        goto ERROR;
 
                // Fetch the strings
-               for (int i = 0; i < strings.count; i++)
-                       ret[i] = pool_id2str(pool, strings.elements[i]);
+               for (int i = 0; i < strings.count; i++) {
+                       str = pool_id2str(pool, strings.elements[i]);
+                       if (!str)
+                               goto ERROR;
+
+                       // Copy string to heap
+                       ret[i] = strdup(str);
+               }
        }
 
 ERROR:
@@ -1594,10 +1601,12 @@ PAKFIRE_EXPORT char* pakfire_package_dump(struct pakfire_package* pkg, int flags
                        pakfire_package_dump_add_line(&string, _("Build ID"), build_id);
 
                // Build Arches
-               const char** build_arches = pakfire_package_get_strings(pkg, PAKFIRE_PKG_BUILD_ARCHES);
+               char** build_arches = pakfire_package_get_strings(pkg, PAKFIRE_PKG_BUILD_ARCHES);
                if (build_arches) {
-                       for (const char** build_arch = build_arches; *build_arch; build_arch++)
+                       for (char** build_arch = build_arches; *build_arch; build_arch++) {
                                pakfire_package_dump_add_line(&string, _("Build Arch"), *build_arch);
+                               free(*build_arch);
+                       }
 
                        free(build_arches);
                }
@@ -1948,8 +1957,7 @@ static int _pakfire_package_add_json_dependencies(
                return 1;
 
        // Add dependencies
-       int r = pakfire_json_add_string_array(pkg->pakfire, json,
-               name, (const char**)dependencies);
+       int r = pakfire_json_add_string_array(pkg->pakfire, json, name, dependencies);
        if (r)
                goto ERROR;
 
@@ -2226,9 +2234,13 @@ static int pakfire_package_add_build_metadata(struct pakfire_package* pkg,
        }
 
        // Write build arches
-       const char** build_arches = pakfire_package_get_strings(pkg, PAKFIRE_PKG_BUILD_ARCHES);
+       char** build_arches = pakfire_package_get_strings(pkg, PAKFIRE_PKG_BUILD_ARCHES);
        if (build_arches) {
                r = pakfire_json_add_string_array(pkg->pakfire, object, "arches", build_arches);
+
+               // Cleanup
+               for (char** build_arch = build_arches; *build_arch; build_arch++)
+                       free(*build_arch);
                free(build_arches);
 
                if (r)
index 311d0e2d504d6b6a940da53b69d619c2a6f5bd3b..090be50e19ef3137efc0bd5cceb665b29b77e9f5 100644 (file)
@@ -847,7 +847,7 @@ int pakfire_json_add_string(struct pakfire* pakfire, struct json_object* json,
 }
 
 int pakfire_json_add_string_array(struct pakfire* pakfire, struct json_object* json,
-               const char* name, const char** array) {
+               const char* name, char** array) {
        int r = 1;
 
        // Allocate a new array
@@ -856,7 +856,7 @@ int pakfire_json_add_string_array(struct pakfire* pakfire, struct json_object* j
                goto ERROR;
 
        // Add all items on list to the array
-       for (const char** item = array; *item; item++) {
+       for (char** item = array; *item; item++) {
                r = json_object_array_add(object, json_object_new_string(*item));
                if (r)
                        goto ERROR;