]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
refactor(dracut-install): do not call dirname() directly
authorMarcos Mello <marcosfrm@gmail.com>
Sun, 24 Jul 2022 19:49:17 +0000 (16:49 -0300)
committerJóhann B. Guðmundsson <johannbg@gmail.com>
Fri, 12 Aug 2022 11:45:59 +0000 (11:45 +0000)
Avoid its horrible API. Borrow dirname_malloc() from systemd:

https://github.com/systemd/systemd/blob/v251/src/basic/path-util.c#L775
https://github.com/systemd/systemd/blob/v251/src/basic/path-util.h#L150

(licence is LGPLv2.1 or later)

src/install/dracut-install.c
src/install/util.c
src/install/util.h

index bef509811637b2b53c48c0586c2c5b1788009c6b..8daa608843430c2b173195891bc759986064eb7c 100644 (file)
@@ -387,26 +387,18 @@ static int library_install(const char *src, const char *lib)
         free(p);
         p = strdup(lib);
 
-        pdir = dirname(p);
+        pdir = dirname_malloc(p);
         if (!pdir)
                 return ret;
 
-        pdir = strdup(pdir);
-        ppdir = dirname(pdir);
+        ppdir = dirname_malloc(pdir);
         if (!ppdir)
                 return ret;
 
-        ppdir = strdup(ppdir);
-        pppdir = dirname(ppdir);
+        pppdir = dirname_malloc(ppdir);
         if (!pppdir)
                 return ret;
 
-        pppdir = strdup(pppdir);
-        if (!pppdir)
-                return ret;
-
-        strcpy(p, lib);
-
         clibdir = streq(basename(ppdir), "glibc-hwcaps") ? pppdir : ppdir;
         clib = strjoin(clibdir, "/", basename(p), NULL);
         if (dracut_install(clib, clib, false, false, true) == 0)
index 3d54f3883d82cfee80533028ef6c2e7275b4e424..5f32f64aa6b85176ad350f51de49970b6ee508ee 100644 (file)
@@ -25,6 +25,7 @@
 #include <fcntl.h>
 #include <sys/types.h>
 #include <sys/syscall.h>
+#include <libgen.h>
 
 #include "util.h"
 
@@ -549,3 +550,25 @@ int dracut_asprintf(char **restrict strp, const char *restrict fmt, ...)
 
         return ret;
 }
+
+char *dirname_malloc(const char *path)
+{
+        char *d, *dir, *dir2;
+
+        assert(path);
+
+        d = strdup(path);
+        if (!d)
+                return NULL;
+
+        dir = dirname(d);
+        assert(dir);
+
+        if (dir == d)
+                return d;
+
+        dir2 = strdup(dir);
+        free(d);
+
+        return dir2;
+}
index 4b91e085c2a74c418a0c784e70777b2b73bdaf44..f022f15195dda66d4e27591670c42c51c0d9f058 100644 (file)
@@ -604,5 +604,6 @@ int unhexchar(char c) _const_;
 int unoctchar(char c) _const_;
 
 int dracut_asprintf(char **restrict strp, const char *restrict fmt, ...);
+char *dirname_malloc(const char *path);
 
 #endif