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 <patrik.r.jakobsson@gmail.com> Signed-off-by: Gabriel Laskar <gabriel@lse.epita.fr> Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
This commit is contained in:
parent
5421855219
commit
8b6046a052
4
defs.h
4
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) \
|
||||
|
20
ioctl.c
20
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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user