[PATCH] ioctl: allow to stop decoding number

Gabriel Laskar gabriel at lse.epita.fr
Fri Dec 4 00:07:33 UTC 2015


For some ioctls, like from drm, the identification of the correct ioctl
is done with custom code. Specifying IOCTL_NUMBER_STOP_LOOKUP on
return of ioctl_decode_command_number() disable further calls to
ioctl_lookup()

* defs.h: add macros IOCTL_NUMBER_* to represent ioctl number state decoding
* ioctl.c (SYS_FUNC(ioctl)): use IOCTL_NUMBER_* to stop the decoding

Signed-off-by: Gabriel Laskar <gabriel at lse.epita.fr>
Suggested-by: Patrik Jakobsson <patrik.r.jakobsson at gmail.com>
---
 defs.h  |  4 ++++
 ioctl.c | 20 +++++++++++---------
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/defs.h b/defs.h
index 5086e1d..d0bef94 100644
--- a/defs.h
+++ b/defs.h
@@ -450,6 +450,10 @@ extern const struct xlat whence_codes[];
 #define STACKTRACE_CAPTURE_ON_ENTER 01000 /* Capture stacktrace on "entering" stage */
 #define TRACE_INDIRECT_SUBCALL	02000	/* Syscall is an indirect socket/ipc subcall. */
 
+#define IOCTL_NUMBER_UNKNOWN 0
+#define IOCTL_NUMBER_HANDLED 1
+#define IOCTL_NUMBER_STOP_LOOKUP 010
+
 #define indirect_ipccall(tcp) (tcp->s_ent->sys_flags & TRACE_INDIRECT_SUBCALL)
 
 #if defined(ARM) || defined(AARCH64) \
diff --git a/ioctl.c b/ioctl.c
index adce986..f70dc44 100644
--- a/ioctl.c
+++ b/ioctl.c
@@ -278,15 +278,17 @@ SYS_FUNC(ioctl)
 		printfd(tcp, tcp->u_arg[0]);
 		tprints(", ");
 		ret = ioctl_decode_command_number(tcp);
-		iop = ioctl_lookup(tcp->u_arg[1]);
-		if (iop) {
-			if (ret)
-				tprints(" or ");
-			tprints(iop->symbol);
-			while ((iop = ioctl_next_match(iop)))
-				tprintf(" or %s", iop->symbol);
-		} else if (!ret) {
-			ioctl_print_code(tcp->u_arg[1]);
+		if (!(ret & IOCTL_NUMBER_STOP_LOOKUP)) {
+			iop = ioctl_lookup(tcp->u_arg[1]);
+			if (iop) {
+				if (ret)
+					tprints(" or ");
+				tprints(iop->symbol);
+				while ((iop = ioctl_next_match(iop)))
+					tprintf(" or %s", iop->symbol);
+			} else if (!ret) {
+				ioctl_print_code(tcp->u_arg[1]);
+			}
 		}
 		ret = ioctl_decode(tcp);
 	} else {
-- 
2.6.3





More information about the Strace-devel mailing list