From 10211c67288561cc37928218e47dc542419ed147 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Wed, 30 Aug 2023 16:30:34 +0000 Subject: [PATCH] packages: Copy strings when returning arrays 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 --- src/libpakfire/include/pakfire/package.h | 2 +- src/libpakfire/include/pakfire/util.h | 2 +- src/libpakfire/package.c | 30 +++++++++++++++++------- src/libpakfire/util.c | 4 ++-- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/libpakfire/include/pakfire/package.h b/src/libpakfire/include/pakfire/package.h index 1536a09c9..fc3d5a873 100644 --- a/src/libpakfire/include/pakfire/package.h +++ b/src/libpakfire/include/pakfire/package.h @@ -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); diff --git a/src/libpakfire/include/pakfire/util.h b/src/libpakfire/include/pakfire/util.h index a2e48af1e..e5d32acd0 100644 --- a/src/libpakfire/include/pakfire/util.h +++ b/src/libpakfire/include/pakfire/util.h @@ -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 diff --git a/src/libpakfire/package.c b/src/libpakfire/package.c index 0edd67477..9f1cf2cd7 100644 --- a/src/libpakfire/package.c +++ b/src/libpakfire/package.c @@ -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) diff --git a/src/libpakfire/util.c b/src/libpakfire/util.c index 311d0e2d5..090be50e1 100644 --- a/src/libpakfire/util.c +++ b/src/libpakfire/util.c @@ -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; -- 2.39.5