summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_syscalls.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_syscalls.c')
-rw-r--r--sys/kern/kern_syscalls.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/sys/kern/kern_syscalls.c b/sys/kern/kern_syscalls.c
index a437fb3..6452d96 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)
OpenPOWER on IntegriCloud