From: Eugene Syromyatnikov Date: Thu, 13 Oct 2016 10:15:32 +0000 (+0300) Subject: tests: check decoding of inotify family syscalls X-Git-Tag: v4.15~212 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8b0f48ee061dbb068edb1d50bb732dd3514027af;p=strace tests: check decoding of inotify family syscalls * tests/inotify.c: New file. * tests/inotify_init1.c: Likewise. * tests/inotify.test: New test. * tests/inotify_init1.test: Likewise. * tests/.gitignore: Add inotify and inotify_init1. * tests/Makefile.am (check_PROGRAMS): Likewise. (DECODER_TESTS): Add inotify.test and inotify_init1.test. --- diff --git a/tests/.gitignore b/tests/.gitignore index cfa753b8..8fec8fd4 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -101,6 +101,8 @@ getuid getuid32 getxxid inet-cmsg +inotify +inotify_init1 ioctl ioctl_block ioctl_evdev diff --git a/tests/Makefile.am b/tests/Makefile.am index f7609465..6f85eb64 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -161,6 +161,8 @@ check_PROGRAMS = \ getuid32 \ getxxid \ inet-cmsg \ + inotify \ + inotify_init1 \ ioctl \ ioctl_block \ ioctl_evdev \ @@ -508,6 +510,8 @@ DECODER_TESTS = \ getuid32.test \ getxxid.test \ inet-cmsg.test \ + inotify.test \ + inotify_init1.test \ ioctl.test \ ioctl_block.test \ ioctl_evdev.test \ diff --git a/tests/inotify.c b/tests/inotify.c new file mode 100644 index 00000000..fb665526 --- /dev/null +++ b/tests/inotify.c @@ -0,0 +1,92 @@ +/* + * Check decoding of inotify_add_watch and inotify_rm_watch syscalls. + * + * Copyright (c) 2016 Eugene Syromyatnikov + * 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 + +#if defined(__NR_inotify_add_watch) && defined(__NR_inotify_rm_watch) + +# include +# include +# include + +# include "kernel_types.h" + +int +main(void) +{ + static const struct { + const char *path; + const char *str; + } bogus_path_str = { + ARG_STR("/abc\1/def\2/ghi\3/jkl\4/mno\5/pqr\6/stu\7/vwx\10") }; + static const kernel_ulong_t bogus_fd = + (kernel_ulong_t) 0xfffffeedfffffaceULL; + static const kernel_ulong_t bogus_mask = + (kernel_ulong_t) 0xffffda7affffdeadULL; + static const char *bogus_mask_str = "IN_ACCESS|IN_ATTRIB|" + "IN_CLOSE_WRITE|IN_OPEN|IN_MOVED_TO|IN_DELETE|IN_DELETE_SELF|" + "IN_MOVE_SELF|IN_Q_OVERFLOW|IN_IGNORED|IN_ONLYDIR|" + "IN_DONT_FOLLOW|IN_EXCL_UNLINK|IN_MASK_ADD|IN_ISDIR|IN_ONESHOT|" + "0x18ff1000"; + + long rc; + char *bogus_path = tail_memdup(bogus_path_str.path, + strlen(bogus_path_str.path) + 1); + + rc = syscall(__NR_inotify_add_watch, 0, NULL, 0); + printf("inotify_add_watch(0, NULL, 0) = %s\n", sprintrc(rc)); + + rc = syscall(__NR_inotify_add_watch, bogus_fd, bogus_path + 4096, 0); + printf("inotify_add_watch(%d, %p, %u) = %s\n", + (int) bogus_fd, bogus_path + 4096, 0, sprintrc(rc)); + + rc = syscall(__NR_inotify_add_watch, bogus_fd, bogus_path, bogus_mask); + printf("inotify_add_watch(%d, %s, %s) = %s\n", + (int) bogus_fd, bogus_path_str.str, bogus_mask_str, + sprintrc(rc)); + + rc = syscall(__NR_inotify_rm_watch, 0, 0); + printf("inotify_rm_watch(0, 0) = %s\n", sprintrc(rc)); + + rc = syscall(__NR_inotify_rm_watch, bogus_fd, bogus_fd); + printf("inotify_rm_watch(%d, %d) = %s\n", + (int) bogus_fd, (int) bogus_fd, sprintrc(rc)); + + puts("+++ exited with 0 +++"); + + return 0; +} + +#else + +SKIP_MAIN_UNDEFINED("__NR_inotify_add_watch && __NR_inotify_rm_watch"); + +#endif diff --git a/tests/inotify.test b/tests/inotify.test new file mode 100755 index 00000000..436f3bc8 --- /dev/null +++ b/tests/inotify.test @@ -0,0 +1,6 @@ +#!/bin/sh + +# Check decoding of inotify_add_watch and inotify_rm_watch syscalls. + +. "${srcdir=.}/init.sh" +run_strace_match_diff -e trace=inotify_add_watch,inotify_rm_watch -a23 diff --git a/tests/inotify_init1.c b/tests/inotify_init1.c new file mode 100644 index 00000000..4c08259b --- /dev/null +++ b/tests/inotify_init1.c @@ -0,0 +1,82 @@ +/* + * Check decoding of inotify_init1 syscall. + * + * Copyright (c) 2016 Eugene Syromyatnikov + * 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 + +#if defined(__NR_inotify_init1) + +# include +# include +# include + +# include "kernel_types.h" + +# ifdef O_CLOEXEC +# define cloexec_flag O_CLOEXEC +# else +# define cloexec_flag 0 +# endif +# define all_flags (O_NONBLOCK | cloexec_flag) + +int +main(void) +{ + static const kernel_ulong_t bogus_flags1 = + (kernel_ulong_t) 0xfacefeeddeadbeefULL | O_NONBLOCK; + static const kernel_ulong_t bogus_flags2 = + (kernel_ulong_t) 0x55555550ff96b77bULL & ~all_flags; + + long rc; + + rc = syscall(__NR_inotify_init1, bogus_flags1); + printf("inotify_init1(IN_NONBLOCK|%s%#x) = %s\n", + bogus_flags1 & cloexec_flag ? "IN_CLOEXEC|" : "", + (unsigned int) (bogus_flags1 & ~all_flags), + sprintrc(rc)); + + rc = syscall(__NR_inotify_init1, bogus_flags2); + printf("inotify_init1(%#x /* IN_??? */) = %s\n", + (unsigned int) bogus_flags2, sprintrc(rc)); + + rc = syscall(__NR_inotify_init1, all_flags); + printf("inotify_init1(IN_NONBLOCK%s) = %s\n", + all_flags & cloexec_flag ? "|IN_CLOEXEC" : "", sprintrc(rc)); + + puts("+++ exited with 0 +++"); + + return 0; +} + +#else + +SKIP_MAIN_UNDEFINED("__NR_inotify_init1"); + +#endif diff --git a/tests/inotify_init1.test b/tests/inotify_init1.test new file mode 100755 index 00000000..1a7c9261 --- /dev/null +++ b/tests/inotify_init1.test @@ -0,0 +1,6 @@ +#!/bin/sh + +# Check decoding of inotify_init1 syscall. + +. "${srcdir=.}/init.sh" +run_strace_match_diff -a27