From: Dmitry V. Levin Date: Fri, 22 Apr 2016 20:37:19 +0000 (+0000) Subject: tests: extend test coverage of mmap syscall X-Git-Tag: v4.12~301 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3797d10e827c1ac4da5d0c42c1f7751e29675d34;p=strace tests: extend test coverage of mmap syscall Check decoding of "old mmap" edition of mmap syscall on those architectures that define it. * tests/old_mmap.c: New file. * tests/old_mmap.test: New test. * tests/.gitignore: Add old_mmap. * tests/Makefile.am (check_PROGRAMS): Likewise. (DECODER_TESTS): Add old_mmap.test. --- diff --git a/tests/.gitignore b/tests/.gitignore index f7fbbb3b..5b3cb430 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -120,6 +120,7 @@ net-yy-unix netlink_inet_diag netlink_unix_diag newfstatat +old_mmap oldselect open openat diff --git a/tests/Makefile.am b/tests/Makefile.am index b9dcae09..e16b327c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -171,6 +171,7 @@ check_PROGRAMS = \ netlink_inet_diag \ netlink_unix_diag \ newfstatat \ + old_mmap \ oldselect \ open \ openat \ @@ -419,6 +420,7 @@ DECODER_TESTS = \ net-yy-unix.test \ net.test \ newfstatat.test \ + old_mmap.test \ oldselect.test \ open.test \ openat.test \ diff --git a/tests/old_mmap.c b/tests/old_mmap.c new file mode 100644 index 00000000..c9e802de --- /dev/null +++ b/tests/old_mmap.c @@ -0,0 +1,99 @@ +/* + * Check decoding of "old mmap" edition of mmap syscall. + * + * Copyright (c) 2016 Dmitry V. Levin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "tests.h" +#include + +/* + * On s390x, this is the mmap syscall used by glibc, so, + * from one side, it's already covered by another test, and, from another side, + * it would require additional efforts to filter out mmap calls made by glibc. + */ + +#if defined __NR_mmap && \ +( defined __arm__ \ + || defined __i386__ \ + || defined __m68k__ \ + || (defined __s390__ && !defined __s390x__) \ +) + +# include +# include +# include +# include + +int +main(void) +{ + const unsigned int args1_c[6] = { + 0xdeadbeef, /* addr */ + 0xfacefeed, /* len */ + PROT_READ|PROT_EXEC, /* prot */ + MAP_FILE|MAP_FIXED, /* flags */ + -2U, /* fd */ + 0xbadc0ded /* offset */ + }; + const unsigned int page_size = get_page_size(); + const unsigned int args2_c[6] = { + 0, + page_size, + PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS, + -1U, + 0xfaced000 & -page_size + }; + void *args = tail_memdup(args1_c, sizeof(args1_c)); + + long rc = syscall(__NR_mmap, args); + printf("mmap(%#x, %u, PROT_READ|PROT_EXEC, MAP_FILE|MAP_FIXED" + ", %d, %#x) = %ld %s (%m)\n", + args1_c[0], args1_c[1], args1_c[4], args1_c[5], + rc, errno2name()); + + memcpy(args, args2_c, sizeof(args2_c)); + rc = syscall(__NR_mmap, args); + printf("mmap(NULL, %u, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS" + ", %d, %#x) = %#lx\n", + args2_c[1], args2_c[4], args2_c[5], rc); + + void *addr = (void *) rc; + if (mprotect(addr, page_size, PROT_NONE)) + perror_msg_and_fail("mprotect(%p, %u, PROT_NONE)", + addr, page_size); + + puts("+++ exited with 0 +++"); + return 0; +} + +#else + +SKIP_MAIN_UNDEFINED("__NR_mmap && (__arm__ || __i386__ || __m68k__" + " || (__s390__ && !__s390x__))") + +#endif diff --git a/tests/old_mmap.test b/tests/old_mmap.test new file mode 100755 index 00000000..07fb44a2 --- /dev/null +++ b/tests/old_mmap.test @@ -0,0 +1,6 @@ +#!/bin/sh + +# Check decoding of "old mmap" edition of mmap syscall. + +. "${srcdir=.}/init.sh" +run_strace_match_diff -e trace=mmap