about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2024-09-13 17:08:11 -0400
committerRich Felker <dalias@aerifal.cx>2024-09-13 17:11:00 -0400
commit4ca8c267768e371930ef7ec9593a5f8b44a7f810 (patch)
treeddf334828582818df54b83ec9d7b6f07c5705f51
parent251cbb6366403a056b39638264932c82d18ec610 (diff)
downloadmusl-4ca8c267768e371930ef7ec9593a5f8b44a7f810.tar.gz
musl-4ca8c267768e371930ef7ec9593a5f8b44a7f810.tar.xz
musl-4ca8c267768e371930ef7ec9593a5f8b44a7f810.zip
statx: fix uninitialized attributes/mask in fallback path
commit b817541f1cfd38e4b81257b3215e276ea9d0fc61 introduced statx with
a fallback using fstatat, but failed to fill in stx_rdev_major/minor
and stx_attributes[_mask]. the rdev omission has been addressed
separately. rather than explicitly zeroing the attributes and their
mask, pre-fill the entire structure with zeros. this will also cover
the padding adjacent to stx_mode, in case it's ever used in the
future.

explicit zeroing of stx_btime is removed since, with this change, it
will already be pre-zeroed. as an aside, zeroing it was not strictly
necessary, since STATX_BASIC_STATS does not include STATX_BTIME and
thus does not indicate any validity for it.
-rw-r--r--src/linux/statx.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/linux/statx.c b/src/linux/statx.c
index 5f6dde92..4fb96e4b 100644
--- a/src/linux/statx.c
+++ b/src/linux/statx.c
@@ -19,6 +19,7 @@ int statx(int dirfd, const char *restrict path, int flags, unsigned mask, struct
 	ret = fstatat(dirfd, path, &st, flags);
 	if (ret) return ret;
 
+	*stx = (struct statx){0};
 	stx->stx_dev_major = major(st.st_dev);
 	stx->stx_dev_minor = minor(st.st_dev);
 	stx->stx_rdev_major = major(st.st_rdev);
@@ -37,7 +38,6 @@ int statx(int dirfd, const char *restrict path, int flags, unsigned mask, struct
 	stx->stx_mtime.tv_nsec = st.st_mtim.tv_nsec;
 	stx->stx_ctime.tv_sec = st.st_ctim.tv_sec;
 	stx->stx_ctime.tv_nsec = st.st_ctim.tv_nsec;
-	stx->stx_btime = (struct statx_timestamp){.tv_sec=0, .tv_nsec=0};
 	stx->stx_mask = STATX_BASIC_STATS;
 
 	return 0;