]> git.ipfire.org Git - pakfire.git/commitdiff
util: Remove static buffers from basename/dirname
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 2 Sep 2023 10:42:21 +0000 (10:42 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 2 Sep 2023 10:42:21 +0000 (10:42 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/cgroup.c
src/libpakfire/dist.c
src/libpakfire/downloader.c
src/libpakfire/include/pakfire/util.h
src/libpakfire/linter.c
src/libpakfire/package.c
src/libpakfire/util.c
tests/libpakfire/util.c

index ed00f6df31f29264aae2cf942623d7bff6d88556..032a9ee4311493661f92d7d8acd71d1319c1ff45 100644 (file)
@@ -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);
index b67a5e1937237039f2391ebd6dcacf09554c94b2..2ca637389ae930daeabdab59bc17c401ad81305f 100644 (file)
@@ -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);
 
index ccb0b2498e5c09616f21f424e91e7339ed0e94fb..ee1e926a2a9f3d79c2b96a05023e3132b8fd0b7e 100644 (file)
@@ -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);
        }
 
index ef835a112076f7dee5fb6be530ea425e354edece..6a093fe88607bc3f5e35e499d378525ddf474e7b 100644 (file)
@@ -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);
 
index f1c41f451c30e9d9f61a4634c92009dd9e133c22..2c0df5ac3c40b55c7cb03abc3f53d920cd671940 100644 (file)
@@ -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;
 
index 9394a7c50b8cda7374b86d748727235aab2effac..2d743235d3bb62dd4e18389918ad03833a11d7ea 100644 (file)
@@ -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);
index 3fb0b42079e79594872a9067e371164d3bf6248f..0e0d05756fc7d580837eecf44f53aefd9baad5fd 100644 (file)
@@ -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);
 }
index 6cf8c8339409b9bbbcccc576d562a3e3aa42359e..05662aeceb417e3dda26a44d33ca0ee111a9f19d 100644 (file)
 #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;