From afd1f088e8a3c8258399a30d73d572b60676cbc5 Mon Sep 17 00:00:00 2001 From: Paul Floyd Date: Fri, 5 Sep 2025 08:21:32 +0200 Subject: [PATCH] FreeBSD syscall: add ML_(fd_allowed) check for fstat Also PRE(sys_cap_rights_get) was checking the wrong arg with ML_(fd_allowed). ARG1 is a version number in the syscall, ARG2 is the fd. --- coregrind/m_syswrap/syswrap-freebsd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/coregrind/m_syswrap/syswrap-freebsd.c b/coregrind/m_syswrap/syswrap-freebsd.c index 0c68acdc8..594298420 100644 --- a/coregrind/m_syswrap/syswrap-freebsd.c +++ b/coregrind/m_syswrap/syswrap-freebsd.c @@ -5691,7 +5691,7 @@ PRE(sys_cap_rights_get) { PRINT("sys_cap_rights_get ( %" FMT_REGWORD "d, %" FMT_REGWORD "d, %#" FMT_REGWORD "x )", SARG1, SARG2, ARG3); PRE_REG_READ3(long, "cap_rights_get", int, version, int, fd, vki_cap_rights_t*, rights); - if (!ML_(fd_allowed)(ARG1, "cap_rights_get", tid, False)) + if (!ML_(fd_allowed)(ARG2, "cap_rights_get", tid, False)) SET_STATUS_Failure(VKI_EBADF); PRE_MEM_WRITE("cap_rights_get(rights)", ARG3, sizeof(vki_cap_rights_t)); } @@ -6301,6 +6301,8 @@ PRE(sys_fstat) PRINT("sys_fstat ( %" FMT_REGWORD "d, %#" FMT_REGWORD "x )",SARG1,ARG2); PRE_REG_READ2(int, "fstat", int, fd, struct stat *, sb); PRE_MEM_WRITE( "fstat(sb)", ARG2, sizeof(struct vki_stat) ); + if ( !ML_(fd_allowed)(ARG1, "fstat", tid, False) ) + SET_STATUS_Failure( VKI_EBADF ); } POST(sys_fstat) -- 2.47.3