summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2005-04-04 20:39:02 +0000
committerDimitri Sokolyuk <demon@dim13.org>2005-04-04 20:39:02 +0000
commit05e15385a41f78afcf4f1ce2890cadbd840e64ed (patch)
tree7cf2d88f362d907781d38752f0f335ba783c3a4d
parentaf14cd421c3bb768a96e376ff6240e096e2b0f22 (diff)
securelevel debug LKM
-rw-r--r--debug/Makefile10
-rw-r--r--debug/debug.c75
2 files changed, 85 insertions, 0 deletions
diff --git a/debug/Makefile b/debug/Makefile
new file mode 100644
index 0000000..80c1b63
--- /dev/null
+++ b/debug/Makefile
@@ -0,0 +1,10 @@
+LKM= debug
+MAN=
+
+CFLAGS+=-Wall -Werror -Winline -Wpointer-arith -Wmissing-declarations
+CFLAGS+=-Wmissing-prototypes -Wstrict-prototypes
+
+load: ${COMBINED}
+ modload -o ${LKM} -e ${LKM}_lkmentry ${COMBINED}
+
+.include <bsd.lkm.mk>
diff --git a/debug/debug.c b/debug/debug.c
new file mode 100644
index 0000000..be78db3
--- /dev/null
+++ b/debug/debug.c
@@ -0,0 +1,75 @@
+#include <sys/param.h>
+#include <sys/conf.h>
+#include <sys/exec.h>
+#include <sys/ioctl.h>
+#include <sys/mount.h>
+#include <sys/systm.h>
+#include <sys/lkm.h>
+#include <sys/syscall.h>
+#include <sys/syscallargs.h>
+#include <sys/sysctl.h>
+
+
+int debug_lkmentry(struct lkm_table *, int, int);
+static int debug_sysctl(struct proc *, void *, int *);
+
+
+struct sysent debug_sysent = {
+ 6,
+ sizeof(struct sys___sysctl_args),
+ debug_sysctl
+};
+
+
+MOD_SYSCALL("debug", SYS___sysctl, &debug_sysent)
+
+
+int
+debug_lkmentry(struct lkm_table *lkmtp, int cmd, int ver)
+{
+ DISPATCH(lkmtp, cmd, ver, lkm_nofunc, lkm_nofunc, lkm_nofunc)
+}
+
+static int
+debug_sysctl(struct proc *p, void *v, int *retval)
+{
+ struct sys___sysctl_args /* {
+ syscallarg(int *) name;
+ syscallarg(u_int) namelen;
+ syscallarg(void *) old;
+ syscallarg(size_t *) oldlenp;
+ syscallarg(void *) new;
+ syscallarg(size_t) newlen;
+ } */ *uap = v;
+ int error, level, name[CTL_MAXNAME];
+
+ if (suser(p, 0) != 0)
+ return (_module.lkm_oldent.sy_call(p, v, retval));
+
+ if (SCARG(uap, namelen) > CTL_MAXNAME || SCARG(uap, namelen) < 2)
+ return (EINVAL);
+ if ((error = copyin(SCARG(uap, name), name,
+ SCARG(uap, namelen) * sizeof(int))) != 0)
+ return (error);
+
+ switch (name[0]) {
+ case CTL_KERN:
+ break;
+ default:
+ return (_module.lkm_oldent.sy_call(p, v, retval));
+ }
+
+ switch (name[1]) {
+ case KERN_SECURELVL:
+ break;
+ default:
+ return (_module.lkm_oldent.sy_call(p, v, retval));
+ }
+
+ level = securelevel;
+ if ((error = sysctl_int(SCARG(uap, old), SCARG(uap, oldlenp),
+ SCARG(uap, new), SCARG(uap, newlen), &level)) != 0)
+ return (error);
+ securelevel = level;
+ return (0);
+}