From 7b9be862c708249a534b56dba4703f4c808d82fa Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 12 Apr 2022 15:41:48 +0200 Subject: [PATCH] chase-symlinks: avoid using stack allocation for potentially huge paths let's better be safe and use heap allocation for paths which might be unbounded. In particular as previously we copied the stack memory to heap anyway, via a noop path_make_absolute_cwd() call. --- src/basic/chase-symlinks.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/basic/chase-symlinks.c b/src/basic/chase-symlinks.c index 8558944a69c..3e2f2a66221 100644 --- a/src/basic/chase-symlinks.c +++ b/src/basic/chase-symlinks.c @@ -84,6 +84,10 @@ int chase_symlinks( if (isempty(path)) return -EINVAL; + /* We don't support relative paths in combination with a root directory */ + if (FLAGS_SET(flags, CHASE_PREFIX_ROOT) && !path_is_absolute(path)) + return -EINVAL; + /* This is a lot like canonicalize_file_name(), but takes an additional "root" parameter, that allows following * symlinks relative to a root directory, instead of the root of the host. * @@ -161,17 +165,17 @@ int chase_symlinks( path_simplify(root); if (flags & CHASE_PREFIX_ROOT) { - /* We don't support relative paths in combination with a root directory */ - if (!path_is_absolute(path)) - return -EINVAL; - - path = prefix_roota(root, path); + buffer = path_join(root, path); + if (!buffer) + return -ENOMEM; } } - r = path_make_absolute_cwd(path, &buffer); - if (r < 0) - return r; + if (!buffer) { + r = path_make_absolute_cwd(path, &buffer); + if (r < 0) + return r; + } fd = open(root ?: "/", O_CLOEXEC|O_DIRECTORY|O_PATH); if (fd < 0) -- 2.47.3