From 05e15385a41f78afcf4f1ce2890cadbd840e64ed Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 4 Apr 2005 20:39:02 +0000 Subject: securelevel debug LKM --- debug/Makefile | 10 ++++++++ debug/debug.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 debug/Makefile create mode 100644 debug/debug.c 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 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +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); +} -- cgit v1.2.3