]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
FreeBSD setcred syscall: use arg3 for size
authorPaul Floyd <pjfloyd@wanadoo.fr>
Mon, 6 Oct 2025 08:55:34 +0000 (10:55 +0200)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Mon, 6 Oct 2025 08:55:34 +0000 (10:55 +0200)
Not really our job to check that thwe size is right.
Also revamp the secred testcase.

coregrind/m_syswrap/syswrap-freebsd.c
memcheck/tests/freebsd/setcred.cpp

index eb8a16058667b8c859f0ea71290be8f12d005754..2c3bffa1c2ed91ab13b3fa2b603d9ad0e2849710 100644 (file)
@@ -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
index 464de08efe1abb276adb135228671c653a1238d9..619d1959f1ccccb17d9a313fbbef86202a9d41ac 100644 (file)
@@ -1,6 +1,8 @@
 #include <sys/ucred.h>
 #include <cstring>
 #include <cstdlib>
+#include <cerrno>
+#include <cassert>
 
 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);