From b01e8aa321190c7de62ec1af080c7573ad08a84e Mon Sep 17 00:00:00 2001 From: jhb Date: Fri, 11 Aug 2006 19:23:49 +0000 Subject: [PATCH] MFC: Fix error handling edge cases and register system calls later to make system call modules more robust. --- sys/kern/kern_syscalls.c | 12 +++++++++++- sys/sys/kernel.h | 1 + sys/sys/sysent.h | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/sys/kern/kern_syscalls.c b/sys/kern/kern_syscalls.c index a437fb328cf..6452d968696 100644 --- a/sys/kern/kern_syscalls.c +++ b/sys/kern/kern_syscalls.c @@ -97,8 +97,11 @@ syscall_module_handler(struct module *mod, int what, void *arg) case MOD_LOAD : error = syscall_register(data->offset, data->new_sysent, &data->old_sysent); - if (error) + if (error) { + /* Leave a mark so we know to safely unload below. */ + data->offset = NULL; return error; + } ms.intval = *data->offset; MOD_XLOCK; module_setspecific(mod, &ms); @@ -108,6 +111,13 @@ syscall_module_handler(struct module *mod, int what, void *arg) return error; case MOD_UNLOAD : + /* + * MOD_LOAD failed, so just return without calling the + * chained handler since we didn't pass along the MOD_LOAD + * event. + */ + if (data->offset == NULL) + return (0); if (data->chainevh) { error = data->chainevh(mod, what, data->chainarg); if (error) diff --git a/sys/sys/kernel.h b/sys/sys/kernel.h index a5f31be3adc..ec00231aad4 100644 --- a/sys/sys/kernel.h +++ b/sys/sys/kernel.h @@ -160,6 +160,7 @@ enum sysinit_sub_id { SI_SUB_MOUNT_ROOT = 0xb400000, /* root mount*/ SI_SUB_SWAP = 0xc000000, /* swap */ SI_SUB_INTRINSIC_POST = 0xd000000, /* proc 0 cleanup*/ + SI_SUB_SYSCALLS = 0xd800000, /* register system calls */ SI_SUB_KTHREAD_INIT = 0xe000000, /* init process*/ SI_SUB_KTHREAD_PAGE = 0xe400000, /* pageout daemon*/ SI_SUB_KTHREAD_VM = 0xe800000, /* vm daemon*/ diff --git a/sys/sys/sysent.h b/sys/sys/sysent.h index 2ac793ce8ee..fa23b0eb7c5 100644 --- a/sys/sys/sysent.h +++ b/sys/sys/sysent.h @@ -114,7 +114,7 @@ static moduledata_t name##_mod = { \ syscall_module_handler, \ &name##_syscall_mod \ }; \ -DECLARE_MODULE(name, name##_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE) +DECLARE_MODULE(name, name##_mod, SI_SUB_SYSCALLS, SI_ORDER_MIDDLE) #define SYSCALL_MODULE_HELPER(syscallname) \ static int syscallname##_syscall = SYS_##syscallname; \ -- 2.45.2