From f54eb6e71db42c7b2bc5e7168ee9143f6a6e027e Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 2 Sep 2023 10:42:21 +0000 Subject: [PATCH] util: Remove static buffers from basename/dirname Signed-off-by: Michael Tremer --- src/libpakfire/cgroup.c | 7 +++-- src/libpakfire/dist.c | 32 ++++++++++++-------- src/libpakfire/downloader.c | 9 ++++-- src/libpakfire/include/pakfire/util.h | 9 ++++-- src/libpakfire/linter.c | 2 +- src/libpakfire/package.c | 34 ++++++++++++++++------ src/libpakfire/util.c | 42 ++++++++++++++++++--------- tests/libpakfire/util.c | 8 +++-- 8 files changed, 99 insertions(+), 44 deletions(-) diff --git a/src/libpakfire/cgroup.c b/src/libpakfire/cgroup.c index ed00f6df3..032a9ee43 100644 --- a/src/libpakfire/cgroup.c +++ b/src/libpakfire/cgroup.c @@ -172,6 +172,7 @@ static enum pakfire_cgroup_controllers pakfire_cgroup_find_controller_by_name( static struct pakfire_cgroup* pakfire_cgroup_parent(struct pakfire_cgroup* cgroup) { struct pakfire_cgroup* parent = NULL; + char path[PATH_MAX]; int r; // Cannot return parent for root group @@ -179,15 +180,15 @@ static struct pakfire_cgroup* pakfire_cgroup_parent(struct pakfire_cgroup* cgrou return NULL; // Determine the path of the parent - const char* path = pakfire_dirname(cgroup->path); - if (!path) { + r = pakfire_dirname(path, cgroup->path); + if (r) { ERROR(cgroup->pakfire, "Could not determine path for parent cgroup: %m\n"); return NULL; } // dirname() returns . if no directory component could be found if (strcmp(path, ".") == 0) - path = NULL; + *path = '\0'; // Open the cgroup r = pakfire_cgroup_open(&parent, cgroup->pakfire, path, 0); diff --git a/src/libpakfire/dist.c b/src/libpakfire/dist.c index b67a5e193..2ca637389 100644 --- a/src/libpakfire/dist.c +++ b/src/libpakfire/dist.c @@ -59,6 +59,7 @@ static const char* pakfire_dist_excludes[] = { static int pakfire_makefile_set_defaults(struct pakfire* pakfire, struct pakfire_parser* parser, const char* path) { + char dirname[PATH_MAX]; char buffer[1024]; int r; @@ -127,8 +128,11 @@ static int pakfire_makefile_set_defaults(struct pakfire* pakfire, } // Set BASEDIR - const char* dirname = pakfire_dirname(path); - if (dirname) { + r = pakfire_dirname(dirname, path); + if (r) + return r; + + if (*dirname) { const char* root = pakfire_get_path(pakfire); pakfire_parser_set(parser, NULL, "BASEDIR", @@ -342,29 +346,33 @@ ERROR: return r; } -static const char* pakfire_dist_find_root(struct pakfire* pakfire, const char* file) { +#define pakfire_dist_find_root(root, file) \ + __pakfire_dist_find_root(root, sizeof(root), file) + +static int __pakfire_dist_find_root(char* root, const size_t length, const char* file) { char path[PATH_MAX]; // Find the absolute path of the makefile char* p = realpath(file, path); - if (!p) { - ERROR(pakfire, "realpath(%s) failed: %m\n", file); - return NULL; - } + if (!p) + return -errno; // Return the parent directory - return pakfire_dirname(p); + return __pakfire_dirname(root, length, p); } static int pakfire_dist_add_files(struct pakfire* pakfire, struct pakfire_packager* packager, const char* file) { struct pakfire_filelist* filelist = NULL; - int r = 1; + char root[PATH_MAX]; + int r; // Find the package directory - const char* root = pakfire_dist_find_root(pakfire, file); - if (!root) - return 1; + r = pakfire_dist_find_root(root, file); + if (r) { + ERROR_ERRNO(pakfire, r, "Could not find package root directory: %m\n"); + return r; + } DEBUG(pakfire, "Adding all files in '%s' to package...\n", root); diff --git a/src/libpakfire/downloader.c b/src/libpakfire/downloader.c index ccb0b2498..ee1e926a2 100644 --- a/src/libpakfire/downloader.c +++ b/src/libpakfire/downloader.c @@ -258,6 +258,8 @@ static struct pakfire_transfer* pakfire_downloader_create_transfer( const size_t expected_digest_length, enum pakfire_transfer_flags flags) { struct pakfire_config* config = NULL; + char filename[PATH_MAX]; + int r; DEBUG(downloader->pakfire, "Adding download of %s\n", url); @@ -302,8 +304,11 @@ static struct pakfire_transfer* pakfire_downloader_create_transfer( // Or use the filename } else { - const char* filename = pakfire_basename(url); - if (filename) + r = pakfire_basename(filename, url); + if (r) + goto ERROR; + + if (*filename) pakfire_string_set(transfer->title, filename); } diff --git a/src/libpakfire/include/pakfire/util.h b/src/libpakfire/include/pakfire/util.h index ef835a112..6a093fe88 100644 --- a/src/libpakfire/include/pakfire/util.h +++ b/src/libpakfire/include/pakfire/util.h @@ -46,8 +46,13 @@ int pakfire_path_strip_extension(char* path); __pakfire_path_replace_extension(path, sizeof(path), extension) int __pakfire_path_replace_extension(char* path, const size_t length, const char* extension); -const char* pakfire_basename(const char* path); -const char* pakfire_dirname(const char* path); +#define pakfire_basename(basename, path) \ + __pakfire_basename(basename, sizeof(basename), path) +int __pakfire_basename(char* basename, const size_t length, const char* path); + +#define pakfire_dirname(dirname, path) \ + __pakfire_dirname(dirname, sizeof(dirname), path) +int __pakfire_dirname(char* dirname, const size_t length, const char* path); char* pakfire_remove_trailing_newline(char* str); diff --git a/src/libpakfire/linter.c b/src/libpakfire/linter.c index f1c41f451..2c0df5ac3 100644 --- a/src/libpakfire/linter.c +++ b/src/libpakfire/linter.c @@ -41,7 +41,7 @@ static int pakfire_lint_makefile_name(struct pakfire* pakfire, } // Determine the basename of the file - r = pakfire_string_set(basename, pakfire_basename(path)); + r = pakfire_basename(basename, path); if (r) return r; diff --git a/src/libpakfire/package.c b/src/libpakfire/package.c index 9394a7c50..2d743235d 100644 --- a/src/libpakfire/package.c +++ b/src/libpakfire/package.c @@ -845,14 +845,14 @@ PAKFIRE_EXPORT const char* pakfire_package_get_string( PAKFIRE_EXPORT int pakfire_package_set_string( struct pakfire_package* pkg, const enum pakfire_package_key key, const char* value) { + char basename[PATH_MAX]; + char dirname[PATH_MAX]; Id id = ID_NULL; + int r; Pool* pool = pakfire_get_solv_pool(pkg->pakfire); Solvable* s = get_solvable(pkg); - const char* basename = NULL; - const char* dirname = NULL; - switch (key) { // Do not allow to change name, evr, or arch case PAKFIRE_PKG_NAME: @@ -923,16 +923,21 @@ PAKFIRE_EXPORT int pakfire_package_set_string( case PAKFIRE_PKG_PATH: if (value) { - basename = pakfire_basename(value); - dirname = pakfire_dirname(value); + r = pakfire_basename(basename, value); + if (r) + return r; + + r = pakfire_dirname(dirname, value); + if (r) + return r; } - if (basename) + if (*basename) solvable_set_str(s, SOLVABLE_MEDIAFILE, basename); else solvable_unset(s, SOLVABLE_MEDIAFILE); - if (dirname) + if (*dirname) solvable_set_str(s, SOLVABLE_MEDIADIR, dirname); else solvable_unset(s, SOLVABLE_MEDIADIR); @@ -1909,6 +1914,10 @@ ERROR: } int pakfire_package_append_file(struct pakfire_package* pkg, const char* path) { + char basename[PATH_MAX]; + char dirname[PATH_MAX]; + int r; + // Fetch repodata struct pakfire_repo* repo = pakfire_package_get_repo(pkg); if (!repo) { @@ -1919,8 +1928,15 @@ int pakfire_package_append_file(struct pakfire_package* pkg, const char* path) { Repodata* repodata = pakfire_repo_get_repodata(repo); - const char* basename = pakfire_basename(path); - const char* dirname = pakfire_dirname(path); + // Get filename part + r = pakfire_basename(basename, path); + if (r) + return r; + + // Get directory part + r = pakfire_dirname(dirname, path); + if (r) + return r; // Convert directory into ID Id did = repodata_str2dir(repodata, dirname, 1); diff --git a/src/libpakfire/util.c b/src/libpakfire/util.c index 3fb0b4207..0e0d05756 100644 --- a/src/libpakfire/util.c +++ b/src/libpakfire/util.c @@ -316,28 +316,38 @@ ERROR: return r; } -const char* pakfire_basename(const char* path) { - static char buffer[PATH_MAX]; +int __pakfire_basename(char* __basename, const size_t length, const char* path) { + char buffer[PATH_MAX]; int r; - // Copy string + // Copy the path into the buffer r = pakfire_string_set(buffer, path); if (r) - return NULL; + return r; + + // Run basename() + char* p = basename(buffer); + if (!p) + return -errno; - return basename(buffer); + return __pakfire_string_set(__basename, length, p); } -const char* pakfire_dirname(const char* path) { - static char buffer[PATH_MAX]; +int __pakfire_dirname(char* __dirname, const size_t length, const char* path) { + char buffer[PATH_MAX]; int r; - // Copy string + // Copy the path into the buffer r = pakfire_string_set(buffer, path); if (r) - return NULL; + return r; - return dirname(buffer); + // Run dirname() + char* p = dirname(buffer); + if (!p) + return -errno; + + return __pakfire_string_set(__dirname, length, p); } char* pakfire_remove_trailing_newline(char* str) { @@ -528,9 +538,15 @@ ERROR: } int pakfire_mkparentdir(const char* path, mode_t mode) { - const char* dirname = pakfire_dirname(path); - if (!dirname) - return 1; + char dirname[PATH_MAX]; + int r; + + r = pakfire_dirname(dirname, path); + if (r) + return r; + + if (!*dirname) + return 0; return pakfire_mkdir(dirname, mode); } diff --git a/tests/libpakfire/util.c b/tests/libpakfire/util.c index 6cf8c8339..05662aece 100644 --- a/tests/libpakfire/util.c +++ b/tests/libpakfire/util.c @@ -23,9 +23,11 @@ #include "../testsuite.h" static int test_basename(const struct test* t) { + char basename[PATH_MAX]; const char* dir = "/a/b/c"; - ASSERT_STRING_EQUALS(pakfire_basename(dir), "c"); + ASSERT_SUCCESS(pakfire_basename(basename, dir)); + ASSERT_STRING_EQUALS(basename, "c"); return EXIT_SUCCESS; @@ -34,9 +36,11 @@ FAIL: } static int test_dirname(const struct test* t) { + char dirname[PATH_MAX]; const char* dir = "/a/b/c"; - ASSERT_STRING_EQUALS(pakfire_dirname(dir), "/a/b"); + ASSERT_SUCCESS(pakfire_dirname(dirname, dir)); + ASSERT_STRING_EQUALS(dirname, "/a/b"); return EXIT_SUCCESS; -- 2.39.5