]> granicus.if.org Git - strace/commitdiff
ioctl: implement INOTIFY_IOC_SETNEXTWD decoding
authorEugene Syromyatnikov <evgsyr@gmail.com>
Fri, 18 May 2018 17:16:17 +0000 (19:16 +0200)
committerDmitry V. Levin <ldv@altlinux.org>
Fri, 25 May 2018 09:15:03 +0000 (09:15 +0000)
* inotify_ioctl.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* defs.h (DECL_IOCTL(inotify)): New declaration.
* ioctl.c (ioctl_decode) <case 'I'>: 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.

Makefile.am
defs.h
inotify_ioctl.c [new file with mode: 0644]
ioctl.c
tests/.gitignore
tests/gen_tests.in
tests/ioctl_inotify.c [new file with mode: 0644]
tests/pure_executables.list

index acea500778004b4a7e9c2a6510569e3da6b915d0..5f3eb288489323520df1f9bae30ac3781b1d8fb5 100644 (file)
@@ -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 8f4e9455325ce55e7b3237bc8c6bd1ea1b13cafe..b401cccb71f4bd8858653b38a09fe41b866ad8c0 100644 (file)
--- 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 (file)
index 0000000..c286e57
--- /dev/null
@@ -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 <linux/ioctl.h>
+
+#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 bf4f074be5ea36f7c99901becc06b6116611e460..9d2f9d52586070b0c9e6249ce6e9aa066d1705ab 100644 (file)
--- 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;
        }
index c12cc09b4152338c76f63a2af4f94fd1fe821ed4..780079b46802b72a00cfd2b3b98bee951cc9b6e4 100644 (file)
@@ -136,6 +136,7 @@ ioctl_dm
 ioctl_dm-v
 ioctl_evdev
 ioctl_evdev-v
+ioctl_inotify
 ioctl_kvm_run
 ioctl_loop
 ioctl_loop-nv
index faf315cde6c2ed89db25e558a81f32e3b623d007..ee249e746c8955caac4c526aa41a8e6bef3b34dc 100644 (file)
@@ -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 (file)
index 0000000..88bd3b1
--- /dev/null
@@ -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 <inttypes.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <linux/ioctl.h>
+
+#include <sys/ioctl.h>
+#include <sys/sysmacros.h>
+
+#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;
+}
index 588861c16e3a9561b11671e2af35dff510db3c96..9c7343d53b7ec1ccac64a5c97e5c7ac744bd0ab1 100755 (executable)
@@ -107,6 +107,7 @@ ioctl
 ioctl_block
 ioctl_dm
 ioctl_evdev
+ioctl_inotify
 ioctl_kvm_run
 ioctl_loop
 ioctl_mtd