Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/kern Don't crash if we are on a hippie trail, head full ...
details: https://anonhg.NetBSD.org/src/rev/ba3456513fcc
branches: trunk
changeset: 848229:ba3456513fcc
user: christos <christos%NetBSD.org@localhost>
date: Tue Jan 21 15:25:38 2020 +0000
description:
Don't crash if we are on a hippie trail, head full of zombie
diffstat:
sys/kern/kern_module.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++-
sys/kern/tty.c | 6 +-
2 files changed, 84 insertions(+), 5 deletions(-)
diffs (186 lines):
diff -r dcbbe88f198c -r ba3456513fcc sys/kern/kern_module.c
--- a/sys/kern/kern_module.c Tue Jan 21 14:58:58 2020 +0000
+++ b/sys/kern/kern_module.c Tue Jan 21 15:25:38 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_module.c,v 1.143 2019/12/31 13:07:13 ad Exp $ */
+/* $NetBSD: kern_module.c,v 1.144 2020/01/21 15:25:38 christos Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.143 2019/12/31 13:07:13 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.144 2020/01/21 15:25:38 christos Exp $");
#define _MODULE_INTERNAL
@@ -62,6 +62,10 @@
const char *module_machine;
char module_base[MODULE_BASE_SIZE];
+#ifndef MODULE_NOAUTOLOAD
+#define MODULE_NOAUTOLOAD "compat_linux* filemon"
+#endif
+
struct modlist module_list = TAILQ_HEAD_INITIALIZER(module_list);
struct modlist module_builtins = TAILQ_HEAD_INITIALIZER(module_builtins);
static struct modlist module_bootlist = TAILQ_HEAD_INITIALIZER(module_bootlist);
@@ -94,6 +98,7 @@
u_int module_gen = 1;
static kcondvar_t module_thread_cv;
static kmutex_t module_thread_lock;
+static kmutex_t module_noautoload_lock;
static int module_thread_ticks;
int (*module_load_vfs_vec)(const char *, int, bool, module_t *,
prop_dictionary_t *) = (void *)eopnotsupp;
@@ -121,12 +126,14 @@
static void module_enqueue(module_t *);
static bool module_merge_dicts(prop_dictionary_t, const prop_dictionary_t);
+static bool module_allow_autoload(const char *);
static void sysctl_module_setup(void);
static int sysctl_module_autotime(SYSCTLFN_PROTO);
static void module_callback_load(struct module *);
static void module_callback_unload(struct module *);
+static void module_noautoload(const char *);
#define MODULE_CLASS_MATCH(mi, modclass) \
((modclass) == MODULE_CLASS_ANY || (modclass) == (mi)->mi_class)
@@ -413,6 +420,7 @@
}
cv_init(&module_thread_cv, "mod_unld");
mutex_init(&module_thread_lock, MUTEX_DEFAULT, IPL_NONE);
+ mutex_init(&module_noautoload_lock, MUTEX_DEFAULT, IPL_NONE);
TAILQ_INIT(&modcblist);
#ifdef MODULAR /* XXX */
@@ -445,6 +453,7 @@
module_netbsd = module_newmodule(MODULE_SOURCE_KERNEL);
module_netbsd->mod_refcnt = 1;
module_netbsd->mod_info = &module_netbsd_modinfo;
+ module_noautoload(MODULE_NOAUTOLOAD);
}
/*
@@ -504,6 +513,67 @@
return (0);
}
+static char noautoload_buf[1024];
+static char *noautoload_ebuf;
+
+static void
+module_noautoload(const char *pat)
+{
+ const unsigned char *p = (const unsigned char *)pat;
+ unsigned char *q = (unsigned char *)noautoload_buf;
+
+ mutex_enter(&module_noautoload_lock);
+
+ *q = '\0';
+ while (*p) {
+ while (*p && isspace(*p)) p++;
+ while (*p && !isspace(*p)) *q++ = *p++;
+ *q++ = '\0';
+ }
+ noautoload_ebuf = q;
+
+ mutex_exit(&module_noautoload_lock);
+}
+
+static bool
+module_allow_autoload(const char *name)
+{
+ const char *p;
+
+ mutex_enter(&module_noautoload_lock);
+ for (p = noautoload_buf; p < noautoload_ebuf; p += strlen(p) + 1) {
+ if (pmatch(name, p, NULL) > 0) {
+ mutex_exit(&module_noautoload_lock);
+ return false;
+ }
+ }
+ mutex_exit(&module_noautoload_lock);
+ return true;
+}
+
+static int
+sysctl_module_noautoload(SYSCTLFN_ARGS)
+{
+ struct sysctlnode node;
+ int error;
+ char newbuf[sizeof(noautoload_buf)];
+
+ node = *rnode;
+ node.sysctl_data = newbuf;
+ node.sysctl_size = sizeof(newbuf);
+
+ error = sysctl_lookup(SYSCTLFN_CALL(&node));
+ if (error || newp == NULL)
+ return error;
+
+ if (strlen(newbuf) + 1 > sizeof(noautoload_buf))
+ return ENOSPC;
+
+ module_noautoload(newbuf);
+
+ return 0;
+}
+
static void
sysctl_module_setup(void)
{
@@ -543,6 +613,12 @@
SYSCTL_DESCR("Auto-unload delay"),
sysctl_module_autotime, 0, &module_autotime, 0,
CTL_CREATE, CTL_EOL);
+ sysctl_createv(&module_sysctllog, 0, &node, NULL,
+ CTLFLAG_PERMANENT | CTLFLAG_READWRITE,
+ CTLTYPE_INT, "noautoload",
+ SYSCTL_DESCR("List of module patterns not to be autoloaded"),
+ sysctl_module_noautoload, 0, NULL, 0,
+ CTL_CREATE, CTL_EOL);
}
/*
@@ -678,6 +754,9 @@
{
int error;
+ if (!module_allow_autoload(filename))
+ return EACCES;
+
kernconfig_lock();
/* Nothing if the user has disabled it. */
diff -r dcbbe88f198c -r ba3456513fcc sys/kern/tty.c
--- a/sys/kern/tty.c Tue Jan 21 14:58:58 2020 +0000
+++ b/sys/kern/tty.c Tue Jan 21 15:25:38 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: tty.c,v 1.285 2020/01/07 08:52:47 skrll Exp $ */
+/* $NetBSD: tty.c,v 1.286 2020/01/21 15:25:38 christos Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -63,7 +63,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.285 2020/01/07 08:52:47 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tty.c,v 1.286 2020/01/21 15:25:38 christos Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -2582,7 +2582,7 @@
}
msg = "found only zombie processes\n";
}
- if (fromsig &&
+ if (pick && fromsig &&
(SIGACTION_PS(pick->p_sigacts, SIGINFO).sa_flags &
SA_NOKERNINFO)) {
mutex_exit(pick->p_lock);
Home |
Main Index |
Thread Index |
Old Index