From 442af676c66d57eb3bbd192b8f0936df1eaf7493 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Fri, 5 Jul 2019 11:09:37 +0000 Subject: [PATCH] tests: check decoding of mode argument of mbind and set_mempolicy syscalls * tests/mbind.c: Include "scno.h". (errstr): New variable. (k_mbind): New function. (out_str): New macro. (mpol_modes): New array. (main): Use it and k_mbind. * tests/set_mempolicy.c: Include "scno.h", do not include , "xlat.h" and "xlat/mpol_modes.h". (errstr): New variable. (k_set_mempolicy): New function. (out_str): New macro. (mpol_modes): New array. (print_nodes): Use it and k_set_mempolicy. (main): Likewise. * tests/mbind-Xabbrev.c: New file. * tests/mbind-Xraw.c: Likewise. * tests/mbind-Xverbose.c: Likewise. * tests/set_mempolicy-Xabbrev.c: Likewise. * tests/set_mempolicy-Xraw.c: Likewise. * tests/set_mempolicy-Xverbose.c: Likewise. * tests/gen_tests.in (mbind-Xabbrev, mbind-Xraw, mbind-Xverbose, set_mempolicy-Xabbrev, set_mempolicy-Xraw, set_mempolicy-Xverbose): New entries. * tests/pure_executables.list: Add mbind-Xabbrev, mbind-Xraw, mbind-Xverbose, set_mempolicy-Xabbrev, set_mempolicy-Xraw, and set_mempolicy-Xverbose. * tests/.gitignore: Likewise. --- tests/.gitignore | 6 ++ tests/gen_tests.in | 8 ++- tests/mbind-Xabbrev.c | 1 + tests/mbind-Xraw.c | 2 + tests/mbind-Xverbose.c | 2 + tests/mbind.c | 128 ++++++++++++++++++++++++++++++--- tests/pure_executables.list | 6 ++ tests/set_mempolicy-Xabbrev.c | 1 + tests/set_mempolicy-Xraw.c | 2 + tests/set_mempolicy-Xverbose.c | 2 + tests/set_mempolicy.c | 98 +++++++++++++++++++++---- 11 files changed, 231 insertions(+), 25 deletions(-) create mode 100644 tests/mbind-Xabbrev.c create mode 100644 tests/mbind-Xraw.c create mode 100644 tests/mbind-Xverbose.c create mode 100644 tests/set_mempolicy-Xabbrev.c create mode 100644 tests/set_mempolicy-Xraw.c create mode 100644 tests/set_mempolicy-Xverbose.c diff --git a/tests/.gitignore b/tests/.gitignore index 178e1076..1a2a653f 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -240,6 +240,9 @@ lstat lstat64 madvise mbind +mbind-Xabbrev +mbind-Xraw +mbind-Xverbose membarrier memfd_create memfd_create-Xabbrev @@ -505,6 +508,9 @@ semop sendfile sendfile64 set_mempolicy +set_mempolicy-Xabbrev +set_mempolicy-Xraw +set_mempolicy-Xverbose set_ptracer_any set_sigblock set_sigign diff --git a/tests/gen_tests.in b/tests/gen_tests.in index 7c50af8e..db162bc6 100644 --- a/tests/gen_tests.in +++ b/tests/gen_tests.in @@ -199,6 +199,9 @@ lstat -a32 -v -P stat.sample -P /dev/full lstat64 -a32 -v -P stat.sample -P /dev/full madvise -a33 mbind +mbind-Xabbrev -Xabbrev -e trace=mbind +mbind-Xraw -a33 -Xraw -e trace=mbind +mbind-Xverbose -Xverbose -e trace=mbind membarrier -a36 memfd_create memfd_create-Xabbrev -Xabbrev -e trace=memfd_create @@ -417,7 +420,10 @@ select-P -a36 -e trace=select -P /dev/full 9>>/dev/full semop -a32 -e trace=semop,semtimedop sendfile -a27 sendfile64 -a29 -set_mempolicy -s3 -a35 +set_mempolicy -a34 -s3 +set_mempolicy-Xabbrev -a34 -s3 -Xabbrev -e trace=set_mempolicy +set_mempolicy-Xraw -a24 -s3 -Xraw -e trace=set_mempolicy +set_mempolicy-Xverbose -s3 -Xverbose -e trace=set_mempolicy setdomainname -a24 setfsgid -a12 setfsgid32 -a14 diff --git a/tests/mbind-Xabbrev.c b/tests/mbind-Xabbrev.c new file mode 100644 index 00000000..a318b5d2 --- /dev/null +++ b/tests/mbind-Xabbrev.c @@ -0,0 +1 @@ +#include "mbind.c" diff --git a/tests/mbind-Xraw.c b/tests/mbind-Xraw.c new file mode 100644 index 00000000..86f9608b --- /dev/null +++ b/tests/mbind-Xraw.c @@ -0,0 +1,2 @@ +#define XLAT_RAW 1 +#include "mbind.c" diff --git a/tests/mbind-Xverbose.c b/tests/mbind-Xverbose.c new file mode 100644 index 00000000..29285cc0 --- /dev/null +++ b/tests/mbind-Xverbose.c @@ -0,0 +1,2 @@ +#define XLAT_VERBOSE 1 +#include "mbind.c" diff --git a/tests/mbind.c b/tests/mbind.c index 8e478a6f..3ca84aea 100644 --- a/tests/mbind.c +++ b/tests/mbind.c @@ -9,26 +9,132 @@ #include "tests.h" #include +#include "scno.h" #ifdef __NR_mbind # include # include +static const char *errstr; + +static long +k_mbind(const unsigned long start, + const unsigned long len, + const unsigned long mode, + const unsigned long nmask, + const unsigned long maxnode, + const unsigned int flags) +{ + const kernel_ulong_t fill = (kernel_ulong_t) 0xdefaced00000000ULL; + const kernel_ulong_t arg1 = start; + const kernel_ulong_t arg2 = len; + const kernel_ulong_t arg3 = mode; + const kernel_ulong_t arg4 = nmask; + const kernel_ulong_t arg5 = maxnode; + const kernel_ulong_t arg6 = fill | flags; + const long rc = syscall(__NR_mbind, arg1, arg2, arg3, arg4, arg5, arg6); + errstr = sprintrc(rc); + return rc; +} + +# if XLAT_RAW +# define out_str raw +# define flags_str "0xffffffff" +# elif XLAT_VERBOSE +# define out_str verbose +# define flags_str "0xffffffff /* MPOL_MF_STRICT|MPOL_MF_MOVE" \ + "|MPOL_MF_MOVE_ALL|0xfffffff8 */" +# else +# define out_str abbrev +# define flags_str "MPOL_MF_STRICT|MPOL_MF_MOVE|MPOL_MF_MOVE_ALL|0xfffffff8" +# endif + +static struct { + unsigned long val; + const char *raw; + const char *verbose; + const char *abbrev; +} mpol_modes[] = { + { ARG_STR(0), + "0 /* MPOL_DEFAULT */", + "MPOL_DEFAULT" }, + { ARG_STR(0x1), + "0x1 /* MPOL_PREFERRED */", + "MPOL_PREFERRED" }, + { ARG_STR(0x2), + "0x2 /* MPOL_BIND */", + "MPOL_BIND" }, + { ARG_STR(0x3), + "0x3 /* MPOL_INTERLEAVE */", + "MPOL_INTERLEAVE" }, + { ARG_STR(0x4), + "0x4 /* MPOL_LOCAL */", + "MPOL_LOCAL" }, + { ARG_STR(0x8000), + "0x8000 /* MPOL_DEFAULT|MPOL_F_STATIC_NODES */", + "MPOL_DEFAULT|MPOL_F_STATIC_NODES" }, + { ARG_STR(0x4001), + "0x4001 /* MPOL_PREFERRED|MPOL_F_RELATIVE_NODES */", + "MPOL_PREFERRED|MPOL_F_RELATIVE_NODES" }, + { ARG_STR(0xc002), + "0xc002 /* MPOL_BIND|MPOL_F_STATIC_NODES|MPOL_F_RELATIVE_NODES */", + "MPOL_BIND|MPOL_F_STATIC_NODES|MPOL_F_RELATIVE_NODES" }, + { ARG_STR(0x5), + "0x5 /* MPOL_??? */", + "0x5 /* MPOL_??? */" }, + { ARG_STR(0xffff3fff), + "0xffff3fff /* MPOL_??? */", + "0xffff3fff /* MPOL_??? */" }, + { ARG_STR(0xffffffff), + "0xffffffff /* MPOL_F_STATIC_NODES|MPOL_F_RELATIVE_NODES|0xffff3fff */", + "MPOL_F_STATIC_NODES|MPOL_F_RELATIVE_NODES|0xffff3fff" }, +# if SIZEOF_LONG > 4 + { 0xffffffff00000000UL, + "0xffffffff00000000", + "0xffffffff00000000 /* MPOL_??? */", + "0xffffffff00000000 /* MPOL_??? */" }, + { 0xffffffffffff3fffUL, + "0xffffffffffff3fff", + "0xffffffffffff3fff /* MPOL_??? */", + "0xffffffffffff3fff /* MPOL_??? */" }, + { -1UL, + "0xffffffffffffffff", + "0xffffffffffffffff /* MPOL_F_STATIC_NODES|MPOL_F_RELATIVE_NODES" + "|0xffffffffffff3fff */", + "MPOL_F_STATIC_NODES|MPOL_F_RELATIVE_NODES|0xffffffffffff3fff" }, +# endif +}; + int main(void) { - const unsigned long len = (unsigned long) 0xcafef00dbadc0dedULL; - const unsigned long mode = 3; - const unsigned long nodemask = (unsigned long) 0xfacefeedfffffff1ULL; - const unsigned long maxnode = (unsigned long) 0xdeadbeeffffffff2ULL; - const unsigned long flags = -1UL; - - long rc = syscall(__NR_mbind, 0, len, mode, nodemask, maxnode, flags); - printf("mbind(NULL, %lu, %s, %#lx, %lu, %s|%#x) = %ld %s (%m)\n", - len, "MPOL_INTERLEAVE", nodemask, maxnode, - "MPOL_MF_STRICT|MPOL_MF_MOVE|MPOL_MF_MOVE_ALL", - (unsigned) flags & ~7, rc, errno2name()); + const unsigned long size = get_page_size(); + unsigned long *const addr = tail_alloc(size); + const unsigned long start = (unsigned long) 0xfffffff1fffffff2ULL; + const unsigned long len = (unsigned long) 0xfffffff4fffffff4ULL; + const unsigned long nodemask = (unsigned long) 0xfffffff5fffffff6ULL; + const unsigned long maxnode = (unsigned long) 0xfffffff7fffffff8ULL; + + if (k_mbind((unsigned long) addr, size, mpol_modes[0].val, 0, 0, 0)) + perror_msg_and_skip("mbind"); + printf("mbind(%p, %lu, %s, NULL, 0, 0) = 0\n", + addr, size, mpol_modes[0].out_str); + + for (unsigned int i = 0; i < ARRAY_SIZE(mpol_modes); ++i) { + if (i) { + k_mbind((unsigned long) addr, size, mpol_modes[i].val, + 0, 0, 0); + printf("mbind(%p, %lu, %s, NULL, 0, 0) = %s\n", + addr, size, mpol_modes[i].out_str, errstr); + } + + k_mbind(start, len, mpol_modes[i].val, + nodemask, maxnode, -1U); + printf("mbind(%#lx, %lu, %s, %#lx, %lu, %s) = %s\n", + start, len, mpol_modes[i].out_str, + nodemask, maxnode, flags_str, errstr); + } puts("+++ exited with 0 +++"); return 0; diff --git a/tests/pure_executables.list b/tests/pure_executables.list index c4081c77..d306085e 100755 --- a/tests/pure_executables.list +++ b/tests/pure_executables.list @@ -200,6 +200,9 @@ lstat lstat64 madvise mbind +mbind-Xabbrev +mbind-Xraw +mbind-Xverbose membarrier memfd_create memfd_create-Xabbrev @@ -424,6 +427,9 @@ semop sendfile sendfile64 set_mempolicy +set_mempolicy-Xabbrev +set_mempolicy-Xraw +set_mempolicy-Xverbose setdomainname setfsgid setfsgid32 diff --git a/tests/set_mempolicy-Xabbrev.c b/tests/set_mempolicy-Xabbrev.c new file mode 100644 index 00000000..2dbc4871 --- /dev/null +++ b/tests/set_mempolicy-Xabbrev.c @@ -0,0 +1 @@ +#include "set_mempolicy.c" diff --git a/tests/set_mempolicy-Xraw.c b/tests/set_mempolicy-Xraw.c new file mode 100644 index 00000000..47436b51 --- /dev/null +++ b/tests/set_mempolicy-Xraw.c @@ -0,0 +1,2 @@ +#define XLAT_RAW 1 +#include "set_mempolicy.c" diff --git a/tests/set_mempolicy-Xverbose.c b/tests/set_mempolicy-Xverbose.c new file mode 100644 index 00000000..0396cb42 --- /dev/null +++ b/tests/set_mempolicy-Xverbose.c @@ -0,0 +1,2 @@ +#define XLAT_VERBOSE 1 +#include "set_mempolicy.c" diff --git a/tests/set_mempolicy.c b/tests/set_mempolicy.c index 2f4c7fec..1a1ce723 100644 --- a/tests/set_mempolicy.c +++ b/tests/set_mempolicy.c @@ -10,21 +10,85 @@ #include "tests.h" #include +#include "scno.h" #ifdef __NR_set_mempolicy -# include # include # include # include -# include "xlat.h" -# include "xlat/mpol_modes.h" - # define MAX_STRLEN 3 # define NLONGS(n) ((n + 8 * sizeof(long) - 2) \ / (8 * sizeof(long))) +static const char *errstr; + +static long +k_set_mempolicy(const unsigned int mode, + const void *const nmask, + const unsigned long maxnode) +{ + const kernel_ulong_t fill = (kernel_ulong_t) 0xdefaced00000000ULL; + const kernel_ulong_t bad = (kernel_ulong_t) 0xbadc0dedbadc0dedULL; + const kernel_ulong_t arg1 = fill | mode; + const kernel_ulong_t arg2 = (unsigned long) nmask; + const kernel_ulong_t arg3 = maxnode; + const long rc = syscall(__NR_set_mempolicy, + arg1, arg2, arg3, bad, bad, bad); + errstr = sprintrc(rc); + return rc; +} + +# if XLAT_RAW +# define out_str raw +# elif XLAT_VERBOSE +# define out_str verbose +# else +# define out_str abbrev +# endif + +static struct { + unsigned int val; + const char *raw; + const char *verbose; + const char *abbrev; +} mpol_modes[] = { + { ARG_STR(0), + "0 /* MPOL_DEFAULT */", + "MPOL_DEFAULT" }, + { ARG_STR(0x1), + "0x1 /* MPOL_PREFERRED */", + "MPOL_PREFERRED" }, + { ARG_STR(0x2), + "0x2 /* MPOL_BIND */", + "MPOL_BIND" }, + { ARG_STR(0x3), + "0x3 /* MPOL_INTERLEAVE */", + "MPOL_INTERLEAVE" }, + { ARG_STR(0x4), + "0x4 /* MPOL_LOCAL */", + "MPOL_LOCAL" }, + { ARG_STR(0x8000), + "0x8000 /* MPOL_DEFAULT|MPOL_F_STATIC_NODES */", + "MPOL_DEFAULT|MPOL_F_STATIC_NODES" }, + { ARG_STR(0x4001), + "0x4001 /* MPOL_PREFERRED|MPOL_F_RELATIVE_NODES */", + "MPOL_PREFERRED|MPOL_F_RELATIVE_NODES" }, + { ARG_STR(0xc002), + "0xc002 /* MPOL_BIND|MPOL_F_STATIC_NODES|MPOL_F_RELATIVE_NODES */", + "MPOL_BIND|MPOL_F_STATIC_NODES|MPOL_F_RELATIVE_NODES" }, + { ARG_STR(0x5), + "0x5 /* MPOL_??? */", + "0x5 /* MPOL_??? */" }, + { ARG_STR(0xffff3fff), + "0xffff3fff /* MPOL_??? */", + "0xffff3fff /* MPOL_??? */" }, + { ARG_STR(0xffffffff), + "0xffffffff /* MPOL_F_STATIC_NODES|MPOL_F_RELATIVE_NODES|0xffff3fff */", + "MPOL_F_STATIC_NODES|MPOL_F_RELATIVE_NODES|0xffff3fff" } +}; + static void print_nodes(const unsigned long maxnode, unsigned int offset) { @@ -38,10 +102,9 @@ print_nodes(const unsigned long maxnode, unsigned int offset) tail_alloc(size ? size : (offset ? 1 : 0)); memset(nodemask, 0, size); - long rc = syscall(__NR_set_mempolicy, 0, nodemask, maxnode); - const char *errstr = sprintrc(rc); + k_set_mempolicy(mpol_modes[0].val, nodemask, maxnode); - fputs("set_mempolicy(MPOL_DEFAULT, ", stdout); + printf("set_mempolicy(%s, ", mpol_modes[0].out_str); if (nlongs) { putc('[', stdout); @@ -103,15 +166,24 @@ test_offset(const unsigned int offset) int main(void) { - if (syscall(__NR_set_mempolicy, 0, 0, 0)) + if (k_set_mempolicy(mpol_modes[0].val, 0, 0)) perror_msg_and_skip("set_mempolicy"); - puts("set_mempolicy(MPOL_DEFAULT, NULL, 0) = 0"); + printf("set_mempolicy(%s, NULL, 0) = 0\n", mpol_modes[0].out_str); const unsigned long *nodemask = (void *) 0xfacefeedfffffffeULL; - const unsigned long maxnode = (unsigned long) 0xcafef00dbadc0dedULL; - long rc = syscall(__NR_set_mempolicy, 1, nodemask, maxnode); - printf("set_mempolicy(MPOL_PREFERRED, %p, %lu) = %s\n", - nodemask, maxnode, sprintrc(rc)); + const unsigned long maxnode = (unsigned long) 0xcafef00ddeadbeefULL; + + for (unsigned int i = 0; i < ARRAY_SIZE(mpol_modes); ++i) { + if (i) { + k_set_mempolicy(mpol_modes[i].val, 0, 0); + printf("set_mempolicy(%s, NULL, 0) = %s\n", + mpol_modes[i].out_str, errstr); + } + + k_set_mempolicy(mpol_modes[i].val, nodemask, maxnode); + printf("set_mempolicy(%s, %p, %lu) = %s\n", + mpol_modes[i].out_str, nodemask, maxnode, errstr); + } test_offset(0); test_offset(1); -- 2.40.0