From: Eugene Syromyatnikov Date: Fri, 18 May 2018 17:16:17 +0000 (+0200) Subject: ioctl: implement INOTIFY_IOC_SETNEXTWD decoding X-Git-Tag: v4.23~116 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=07a4f1954a2746fcabd7fce223658fd9de4263bb;p=strace ioctl: implement INOTIFY_IOC_SETNEXTWD decoding * inotify_ioctl.c: New file. * Makefile.am (strace_SOURCES): Add it. * defs.h (DECL_IOCTL(inotify)): New declaration. * ioctl.c (ioctl_decode) : Call inotify_ioctl. * tests/ioctl_inotify.c: New file. * tests/.gitignore: Add ioctl_inotify. * tests/pure_executables.list: Likewise. * tests/gen_tests.in (ioctl_inotify): New test. --- diff --git a/Makefile.am b/Makefile.am index acea5007..5f3eb288 100644 --- a/Makefile.am +++ b/Makefile.am @@ -160,6 +160,7 @@ strace_SOURCES = \ hdio.c \ hostname.c \ inotify.c \ + inotify_ioctl.c \ io.c \ ioctl.c \ ioperm.c \ diff --git a/defs.h b/defs.h index 8f4e9455..b401cccb 100644 --- a/defs.h +++ b/defs.h @@ -861,6 +861,7 @@ DECL_IOCTL(dm); DECL_IOCTL(evdev); DECL_IOCTL(file); DECL_IOCTL(fs_x); +DECL_IOCTL(inotify); DECL_IOCTL(kvm); DECL_IOCTL(nsfs); DECL_IOCTL(ptp); diff --git a/inotify_ioctl.c b/inotify_ioctl.c new file mode 100644 index 00000000..c286e57a --- /dev/null +++ b/inotify_ioctl.c @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018 The strace developers. + * 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 "defs.h" + +#include + +#ifndef INOTIFY_IOC_SETNEXTWD +# define INOTIFY_IOC_SETNEXTWD _IOW('I', 0, int32_t) +#endif + +int +inotify_ioctl(struct tcb *const tcp, const unsigned int code, + const kernel_ulong_t arg) +{ + switch (code) { + case INOTIFY_IOC_SETNEXTWD: + tprintf(", %d", (int) arg); + + return RVAL_IOCTL_DECODED; + } + + return RVAL_DECODED; +} diff --git a/ioctl.c b/ioctl.c index bf4f074b..9d2f9d52 100644 --- a/ioctl.c +++ b/ioctl.c @@ -322,6 +322,8 @@ ioctl_decode(struct tcb *tcp) case 0xae: return kvm_ioctl(tcp, code, arg); #endif + case 'I': + return inotify_ioctl(tcp, code, arg); default: break; } diff --git a/tests/.gitignore b/tests/.gitignore index c12cc09b..780079b4 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -136,6 +136,7 @@ ioctl_dm ioctl_dm-v ioctl_evdev ioctl_evdev-v +ioctl_inotify ioctl_kvm_run ioctl_loop ioctl_loop-nv diff --git a/tests/gen_tests.in b/tests/gen_tests.in index faf315cd..ee249e74 100644 --- a/tests/gen_tests.in +++ b/tests/gen_tests.in @@ -133,6 +133,7 @@ ioctl_dm +ioctl.test -s9 ioctl_dm-v +ioctl.test -v -s9 ioctl_evdev +ioctl.test ioctl_evdev-v +ioctl.test -v +ioctl_inotify +ioctl.test ioctl_kvm_run +ioctl.test -a36 -y ioctl_loop +ioctl.test ioctl_loop-nv +ioctl.test -a22 -e verbose=none diff --git a/tests/ioctl_inotify.c b/tests/ioctl_inotify.c new file mode 100644 index 00000000..88bd3b12 --- /dev/null +++ b/tests/ioctl_inotify.c @@ -0,0 +1,77 @@ +/* + * This file is part of ioctl_inotify strace test. + * + * Copyright (c) 2018 The strace developers. + * 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 +#include +#include + +#include + +#include +#include + +#ifndef INOTIFY_IOC_SETNEXTWD +# define INOTIFY_IOC_SETNEXTWD _IOW('I', 0, int32_t) +#endif + +int +main(void) +{ + static const kernel_ulong_t unknown_inotify_cmd = + (kernel_ulong_t) 0xbadc0dedfeed49edULL; + static const kernel_ulong_t magic = + (kernel_ulong_t) 0xdeadbeefbadc0dedULL; + + /* Unknown inotify commands */ + ioctl(-1, unknown_inotify_cmd, magic); + printf("ioctl(-1, _IOC(_IOC_READ|_IOC_WRITE%s, 0x49, %#x, %#x), " + "%#lx) = -1 EBADF (%m)\n", + _IOC_DIR((unsigned int) unknown_inotify_cmd) & _IOC_NONE ? + "|_IOC_NONE" : "", + _IOC_NR((unsigned int) unknown_inotify_cmd), + _IOC_SIZE((unsigned int) unknown_inotify_cmd), + (unsigned long) magic); + + ioctl(-1, INOTIFY_IOC_SETNEXTWD + 1, magic); + printf("ioctl(-1, _IOC(_IOC_WRITE, 0x49, %#x, %#x), %#lx)" + " = -1 EBADF (%m)\n", + (unsigned int) _IOC_NR(INOTIFY_IOC_SETNEXTWD + 1), + (unsigned int) _IOC_SIZE(INOTIFY_IOC_SETNEXTWD + 1), + (unsigned long) magic); + + /* INOTIFY_IOC_SETNEXTWD */ + ioctl(-1, INOTIFY_IOC_SETNEXTWD, magic); + printf("ioctl(-1, INOTIFY_IOC_SETNEXTWD, %d) = -1 EBADF (%m)\n", + (int) magic); + + puts("+++ exited with 0 +++"); + return 0; +} diff --git a/tests/pure_executables.list b/tests/pure_executables.list index 588861c1..9c7343d5 100755 --- a/tests/pure_executables.list +++ b/tests/pure_executables.list @@ -107,6 +107,7 @@ ioctl ioctl_block ioctl_dm ioctl_evdev +ioctl_inotify ioctl_kvm_run ioctl_loop ioctl_mtd