From: Gabriel Laskar Date: Fri, 4 Dec 2015 00:07:33 +0000 (+0100) Subject: ioctl: allow to stop decoding number X-Git-Tag: v4.11~66 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8b6046a052255fe71fac200f0f7b3b76419dc16d;p=strace ioctl: allow to stop decoding number For some ioctls, like from drm, the identification of the correct ioctl is done by custom code. Specifying IOCTL_NUMBER_STOP_LOOKUP on return of ioctl_decode_command_number() disables further calls to ioctl_lookup(). * defs.h (IOCTL_NUMBER_UNKNOWN, IOCTL_NUMBER_HANDLED, IOCTL_NUMBER_STOP_LOOKUP): Add macros representing ioctl number state decoding. * ioctl.c (SYS_FUNC(ioctl)): Skip ioctl_lookup() when ioctl_decode_command_number() returns a value with IOCTL_NUMBER_STOP_LOOKUP flag is set. Suggested-by: Patrik Jakobsson Signed-off-by: Gabriel Laskar Signed-off-by: Dmitry V. Levin --- diff --git a/defs.h b/defs.h index 5086e1d3..d0bef941 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 adce9867..f70dc44e 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 {