Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20240913200016.1590494-1-gabravier@gmail.com>
Date: Fri, 13 Sep 2024 22:00:15 +0200
From: Gabriel Ravier <gabravier@...il.com>
To: musl@...ts.openwall.com
Cc: Gabriel Ravier <gabravier@...il.com>
Subject: [PATCH] statx: fix ENOSYS emulation not setting stx_rdev_*

The current implementation of the statx function fails to set the
values of stx->stx_rdev_major and stx->stx_rdev_minor if the statx
syscall fails with ENOSYS and thus the statx function has to fall back
on fstatat-based emulation.

This commit fixes this.

Note: I have not strictly been able to test this in "natural
conditions", i.e. on a kernel without statx support, but I have been
able to test this on a kernel that has statx and fstatat support in
two different ways:
- by removing the call to __syscall(SYS_statx, ...) and replacing it with
  `int err = -ENOSYS;`, and
- using a seccomp eBPF filter to catch statx syscalls and making them
  return ENOSYS
---
 src/linux/statx.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/linux/statx.c b/src/linux/statx.c
index 4616bff4..5f6dde92 100644
--- a/src/linux/statx.c
+++ b/src/linux/statx.c
@@ -21,6 +21,8 @@ int statx(int dirfd, const char *restrict path, int flags, unsigned mask, struct
 
 	stx->stx_dev_major = major(st.st_dev);
 	stx->stx_dev_minor = minor(st.st_dev);
+	stx->stx_rdev_major = major(st.st_rdev);
+	stx->stx_rdev_minor = minor(st.st_rdev);
 	stx->stx_ino = st.st_ino;
 	stx->stx_mode = st.st_mode;
 	stx->stx_nlink = st.st_nlink;
-- 
2.46.0

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.