path: root/src/stat
diff options
authorSamuel Holland <>2019-07-20 23:52:26 -0500
committerRich Felker <>2019-07-21 00:58:10 -0400
commit0ce49d0a301b4142741b32773492af90f66ed3ca (patch)
tree4206ee87d08bd9705797d32b2d883d85d3ba837b /src/stat
parente53a91da582be156487daae39ab675e1fcb1848d (diff)
use the correct stat structure in the fstat path
commit 01ae3fc6d48f4a45535189b7a6db286535af08ca modified fstatat to translate the kernel's struct stat ("kstat") into the libc struct stat. To do this, it created a local kstat object, and copied its contents into the user-provided object. However, the commit neglected to update the fstat compatibility path and its fallbacks. They continued to pass the user-supplied object to the kernel, later overwiting it with the uninitialized memory in the local temporary.
Diffstat (limited to 'src/stat')
1 files changed, 4 insertions, 4 deletions
diff --git a/src/stat/fstatat.c b/src/stat/fstatat.c
index 7de75462..d915fa10 100644
--- a/src/stat/fstatat.c
+++ b/src/stat/fstatat.c
@@ -67,16 +67,16 @@ static int fstatat_kstat(int fd, const char *restrict path, struct stat *restric
struct kstat kst;
if (flag==AT_EMPTY_PATH && fd>=0 && !*path) {
- ret = __syscall(SYS_fstat, fd, st);
+ ret = __syscall(SYS_fstat, fd, &kst);
if (ret==-EBADF && __syscall(SYS_fcntl, fd, F_GETFD)>=0) {
- ret = __syscall(SYS_fstatat, fd, path, st, flag);
+ ret = __syscall(SYS_fstatat, fd, path, &kst, flag);
if (ret==-EINVAL) {
char buf[15+3*sizeof(int)];
__procfdname(buf, fd);
#ifdef SYS_stat
- ret = __syscall(SYS_stat, buf, st);
+ ret = __syscall(SYS_stat, buf, &kst);
- ret = __syscall(SYS_fstatat, AT_FDCWD, buf, st, 0);
+ ret = __syscall(SYS_fstatat, AT_FDCWD, buf, &kst, 0);