From: Marcos Mello Date: Sun, 24 Jul 2022 19:49:17 +0000 (-0300) Subject: refactor(dracut-install): do not call dirname() directly X-Git-Tag: 058~197 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7f2b09339c063279f736f6d4f079f6dd7ed10577;p=thirdparty%2Fdracut.git refactor(dracut-install): do not call dirname() directly 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) --- diff --git a/src/install/dracut-install.c b/src/install/dracut-install.c index bef509811..8daa60884 100644 --- a/src/install/dracut-install.c +++ b/src/install/dracut-install.c @@ -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) diff --git a/src/install/util.c b/src/install/util.c index 3d54f3883..5f32f64aa 100644 --- a/src/install/util.c +++ b/src/install/util.c @@ -25,6 +25,7 @@ #include #include #include +#include #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; +} diff --git a/src/install/util.h b/src/install/util.h index 4b91e085c..f022f1519 100644 --- a/src/install/util.h +++ b/src/install/util.h @@ -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