]> granicus.if.org Git - strace/commitdiff
tests: check decoding of mode argument of mbind and set_mempolicy syscalls
authorDmitry V. Levin <ldv@altlinux.org>
Fri, 5 Jul 2019 11:09:37 +0000 (11:09 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Fri, 5 Jul 2019 11:09:37 +0000 (11:09 +0000)
* 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 <errno.h>,
"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
tests/gen_tests.in
tests/mbind-Xabbrev.c [new file with mode: 0644]
tests/mbind-Xraw.c [new file with mode: 0644]
tests/mbind-Xverbose.c [new file with mode: 0644]
tests/mbind.c
tests/pure_executables.list
tests/set_mempolicy-Xabbrev.c [new file with mode: 0644]
tests/set_mempolicy-Xraw.c [new file with mode: 0644]
tests/set_mempolicy-Xverbose.c [new file with mode: 0644]
tests/set_mempolicy.c

index 178e10764395649370204d65abb93bf4f869fe56..1a2a653f24a0ef57edb8c59a02d12d97918c1b7b 100644 (file)
@@ -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
index 7c50af8e9222ba08454a500ef7b311df47e7430a..db162bc62d7d9c5f78426394d3bceee5b1c5f778 100644 (file)
@@ -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 (file)
index 0000000..a318b5d
--- /dev/null
@@ -0,0 +1 @@
+#include "mbind.c"
diff --git a/tests/mbind-Xraw.c b/tests/mbind-Xraw.c
new file mode 100644 (file)
index 0000000..86f9608
--- /dev/null
@@ -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 (file)
index 0000000..29285cc
--- /dev/null
@@ -0,0 +1,2 @@
+#define XLAT_VERBOSE 1
+#include "mbind.c"
index 8e478a6f4f512c74cb78a0b57746fb50f4174496..3ca84aea0270d200664c108189ef3e6303af5d31 100644 (file)
 
 #include "tests.h"
 #include <asm/unistd.h>
+#include "scno.h"
 
 #ifdef __NR_mbind
 
 # include <stdio.h>
 # include <unistd.h>
 
+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;
index c4081c77c4c462cb0e50f162ce2f8c4c57f4d53a..d306085e176b10e18d629ed3efaa3d6a8d77e340 100755 (executable)
@@ -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 (file)
index 0000000..2dbc487
--- /dev/null
@@ -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 (file)
index 0000000..47436b5
--- /dev/null
@@ -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 (file)
index 0000000..0396cb4
--- /dev/null
@@ -0,0 +1,2 @@
+#define XLAT_VERBOSE 1
+#include "set_mempolicy.c"
index 2f4c7fec78293aa94be1e7738eefb75541a03458..1a1ce723f578fc8849e74aa8f691c74f7efc19a1 100644 (file)
 
 #include "tests.h"
 #include <asm/unistd.h>
+#include "scno.h"
 
 #ifdef __NR_set_mempolicy
 
-# include <errno.h>
 # include <stdio.h>
 # include <string.h>
 # include <unistd.h>
 
-# 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);