Some syscalls return ENOSYS depending on their arguments. We don't want to stop calling them just because we hit one of those cases. Add a flag to specify this behaviour so we don't have to keep special-casing those calls in mkcall(). --- include/syscall.h | 1 + syscall.c | 23 ++++++----------------- syscalls/futex.c | 2 +- syscalls/ioctl.c | 2 +- syscalls/sendfile.c | 4 ++-- 5 files changed, 11 insertions(+), 21 deletions(-) diff --git a/include/syscall.h b/include/syscall.h index e42cd85..bc19273 100644 --- a/include/syscall.h +++ b/include/syscall.h @@ -121,4 +121,5 @@ struct syscalltable { #define TO_BE_DEACTIVATED (1<<4) #define NEED_ALARM (1<<5) #define EXTRA_FORK (1<<6) +#define IGNORE_ENOSYS (1<<7) diff --git a/syscall.c b/syscall.c index bca2aea..50e64ac 100644 --- a/syscall.c +++ b/syscall.c @@ -176,29 +176,18 @@ bool mkcall(int childno) if (dopause == TRUE) sleep(1); - /* If the syscall doesn't exist don't bother calling it next time. */ - if ((ret == -1UL) && (errno_saved == ENOSYS)) { - - /* Futex is awesome, it ENOSYS's depending on arguments. Sigh. */ - if (call == (unsigned int) search_syscall_table(syscalls, max_nr_syscalls, "futex")) - goto skip_enosys; - - /* Unknown ioctls also ENOSYS. */ - if (call == (unsigned int) search_syscall_table(syscalls, max_nr_syscalls, "ioctl")) - goto skip_enosys; - - /* sendfile() may ENOSYS depending on args. */ - if (call == (unsigned int) search_syscall_table(syscalls, max_nr_syscalls, "sendfile")) - goto skip_enosys; - + /* + * If the syscall doesn't exist don't bother calling it next time. + * Some syscalls return ENOSYS depending on their arguments, we mark + * those as IGNORE_ENOSYS and keep calling them. + */ + if ((ret == -1UL) && (errno_saved == ENOSYS) && !(entry->flags & IGNORE_ENOSYS)) { output(1, "%s (%d) returned ENOSYS, marking as inactive.\n", entry->name, call + SYSCALL_OFFSET); deactivate_syscall(call, syscallrec->do32bit); } -skip_enosys: - if (entry->post) entry->post(childno, syscallrec); diff --git a/syscalls/futex.c b/syscalls/futex.c index 5e194ab..4d18f30 100644 --- a/syscalls/futex.c +++ b/syscalls/futex.c @@ -33,5 +33,5 @@ struct syscallentry syscall_futex = { .arg5type = ARG_ADDRESS, .arg6name = "val3", .rettype = RET_FD, // FIXME: Needs to mutate depending on 'op' value - .flags = NEED_ALARM, + .flags = NEED_ALARM | IGNORE_ENOSYS, }; diff --git a/syscalls/ioctl.c b/syscalls/ioctl.c index 012f055..db3b485 100644 --- a/syscalls/ioctl.c +++ b/syscalls/ioctl.c @@ -70,5 +70,5 @@ struct syscallentry syscall_ioctl = { .arg3name = "arg", .arg3type = ARG_RANDPAGE, .sanitise = sanitise_ioctl, - .flags = NEED_ALARM, + .flags = NEED_ALARM | IGNORE_ENOSYS, }; diff --git a/syscalls/sendfile.c b/syscalls/sendfile.c index 05e49e9..3e74841 100644 --- a/syscalls/sendfile.c +++ b/syscalls/sendfile.c @@ -14,7 +14,7 @@ struct syscallentry syscall_sendfile = { .arg3type = ARG_ADDRESS, .arg4name = "count", .arg4type = ARG_LEN, - .flags = NEED_ALARM, + .flags = NEED_ALARM | IGNORE_ENOSYS, }; /* @@ -32,5 +32,5 @@ struct syscallentry syscall_sendfile64 = { .arg3type = ARG_ADDRESS, .arg4name = "count", .arg4type = ARG_LEN, - .flags = NEED_ALARM, + .flags = NEED_ALARM | IGNORE_ENOSYS, }; -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe trinity" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html