From: Paul Floyd Date: Mon, 6 Oct 2025 08:55:34 +0000 (+0200) Subject: FreeBSD setcred syscall: use arg3 for size X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ea1ec47ce1a8f29bf01412869b6a07e5ee6a2976;p=thirdparty%2Fvalgrind.git FreeBSD setcred syscall: use arg3 for size Not really our job to check that thwe size is right. Also revamp the secred testcase. --- diff --git a/coregrind/m_syswrap/syswrap-freebsd.c b/coregrind/m_syswrap/syswrap-freebsd.c index eb8a16058..2c3bffa1c 100644 --- a/coregrind/m_syswrap/syswrap-freebsd.c +++ b/coregrind/m_syswrap/syswrap-freebsd.c @@ -7154,7 +7154,7 @@ PRE(sys_setcred) { PRINT("sys_setcred(%" FMT_REGWORD "u, %#" FMT_REGWORD "x, %" FMT_REGWORD "u)", ARG1, ARG2, ARG3); PRE_REG_READ3(int, "setcred", u_int, flags, const struct setcred*, wcred, size_t, size); - PRE_MEM_READ("setcred(wcred)", ARG2, sizeof(struct vki_setcred)); + PRE_MEM_READ("setcred(wcred)", ARG2, ARG3); } // SYS_exterrctl 592 diff --git a/memcheck/tests/freebsd/setcred.cpp b/memcheck/tests/freebsd/setcred.cpp index 464de08ef..619d1959f 100644 --- a/memcheck/tests/freebsd/setcred.cpp +++ b/memcheck/tests/freebsd/setcred.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include static long x0; @@ -10,25 +12,44 @@ int main() x0 = px[0]; struct setcred cred1; struct setcred* cred2; - int flags1{0}; - int flags2; + int flags1{SETCREDF_RUID}; + int flags2{SETCREDF_SUPP_GROUPS}; size_t size1{sizeof(cred1)}; + int ret; std::memset(&cred1, 250, sizeof(cred1)); // needs to be root to work correctly - setcred(flags1, &cred1, size1); + ret = setcred(flags1, &cred1, size1); + assert(ret == -1); + assert(errno == EPERM); // not accessible - setcred(flags1, nullptr, size1); + ret = setcred(flags1, nullptr, size1); + assert(ret == -1); + assert(errno == EFAULT); // uninit - setcred(flags2, (struct setcred*)x0, size1+x0); + ret = setcred(flags2+x0, (struct setcred*)x0, size1+x0); + assert(ret == -1); + assert(errno == EFAULT); + + // invalid flags + ret = setcred(9999+x0, &cred1, sizeof(cred1)); + assert(ret == -1); + assert(errno == EINVAL); + + // invalid size + ret = setcred(flags1, &cred1, 3+x0); + assert(ret == -1); + assert(errno == EINVAL); cred2 = new struct setcred; // uninit memory - setcred(flags1, cred2, size1); + ret = setcred(flags1, cred2, size1); + assert(ret == -1); + assert(errno == EPERM); delete cred2; free(px);