From 41fa8e2a26fb053820730f524e78810a6f1c6173 Mon Sep 17 00:00:00 2001 From: Jason Francis Date: Tue, 11 May 2021 12:16:06 -0400 Subject: [PATCH] Use fstatat to check long path sizes in fcntl::readlinkat --- src/fcntl.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/fcntl.rs b/src/fcntl.rs index 9da7d33fc7..2532724bfb 100644 --- a/src/fcntl.rs +++ b/src/fcntl.rs @@ -252,7 +252,18 @@ fn inner_readlink(dirfd: Option, path: &P) -> Result } // Uh oh, the result is too long... // Let's try to ask lstat how many bytes to allocate. - let reported_size = super::sys::stat::lstat(path) + let reported_size = match dirfd { + #[cfg(target_os = "redox")] + Some(_) => unreachable!(), + #[cfg(any(target_os = "android", target_os = "linux"))] + Some(dirfd) => { + let flags = if path.is_empty() { AtFlags::AT_EMPTY_PATH } else { AtFlags::empty() }; + super::sys::stat::fstatat(dirfd, path, flags | AtFlags::AT_SYMLINK_NOFOLLOW) + }, + #[cfg(not(any(target_os = "android", target_os = "linux", target_os = "redox")))] + Some(dirfd) => super::sys::stat::fstatat(dirfd, path, AtFlags::AT_SYMLINK_NOFOLLOW), + None => super::sys::stat::lstat(path) + } .and_then(|x| Ok(x.st_size)) .unwrap_or(0); let mut try_size = if reported_size > 0 {