From: Lennart Poettering Date: Tue, 12 Apr 2022 13:41:48 +0000 (+0200) Subject: chase-symlinks: avoid using stack allocation for potentially huge paths X-Git-Tag: v251-rc2~134^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7b9be862c708249a534b56dba4703f4c808d82fa;p=thirdparty%2Fsystemd.git 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. --- 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)