dracut/backport-fix-dracut-install-tweaks-to-get_real_file.patch
hongjinghao 9d9fb131b3 backport patchs from upstream
(cherry picked from commit 74c55dc789a3aacb444c42ab40cd308bd213f5e3)
2024-02-22 16:48:54 +08:00

83 lines
3.0 KiB
Diff

From 1beeaf3b71aed763d5fc7a9ee044d675f8906e8c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Zolt=C3=A1n=20B=C3=B6sz=C3=B6rm=C3=A9nyi?=
<zboszor@gmail.com>
Date: Sun, 18 Jul 2021 10:28:37 +0200
Subject: [PATCH] fix(dracut-install): tweaks to get_real_file()
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Fix potential memory leaks in two locations and use
_exit(EXIT_FAILURE) if asprintf(&abspath, ...) fails.
Signed-off-by: Zoltán Böszörményi <zboszor@gmail.com>
---
src/install/dracut-install.c | 27 ++++++++++++++++++---------
1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/src/install/dracut-install.c b/src/install/dracut-install.c
index 1086780..f0fc3dc 100644
--- a/src/install/dracut-install.c
+++ b/src/install/dracut-install.c
@@ -419,7 +419,7 @@ static char *get_real_file(const char *src, bool fullyresolve)
char linktarget[PATH_MAX + 1];
ssize_t linksz;
_cleanup_free_ char *fullsrcpath;
- char *abspath = NULL;
+ char *abspath = NULL; /* this is returned from the function, don't _cleanup_free_ */
struct stat sb;
if (sysrootdirlen) {
@@ -460,30 +460,39 @@ static char *get_real_file(const char *src, bool fullyresolve)
}
if (linktarget[0] == '/') {
- if (asprintf(&abspath, "%s%s", (sysrootdirlen ? sysrootdir : ""), linktarget) < 0)
- return NULL;
+ if (asprintf(&abspath, "%s%s", (sysrootdirlen ? sysrootdir : ""), linktarget) < 0) {
+ log_error("Out of memory!");
+ _exit(EXIT_FAILURE);
+ }
} else {
_cleanup_free_ char *fullsrcdir = strdup(fullsrcpath);
if (!fullsrcdir) {
log_error("Out of memory!");
- return NULL;
+ _exit(EXIT_FAILURE);
}
fullsrcdir[dir_len(fullsrcdir)] = '\0';
- if (asprintf(&abspath, "%s/%s", fullsrcdir, linktarget) < 0)
- return NULL;
+ if (asprintf(&abspath, "%s/%s", fullsrcdir, linktarget) < 0) {
+ log_error("Out of memory!");
+ _exit(EXIT_FAILURE);
+ }
}
if (fullyresolve) {
struct stat st;
if (lstat(abspath, &st) < 0) {
- if (errno != ENOENT)
+ if (errno != ENOENT) {
+ free(abspath);
return NULL;
+ }
+ }
+ if (S_ISLNK(st.st_mode)) {
+ char *tmp = get_real_file(abspath, fullyresolve);
+ free(abspath);
+ abspath = tmp;
}
- if (S_ISLNK(st.st_mode))
- return get_real_file(abspath, fullyresolve);
}
log_debug("get_real_file('%s') => '%s'", src, abspath);
--
2.33.0