/* * kern.msgbuf and machdep.msgbuf sysctls protection for FreeBSD 4.x. * * (c) 2003 Pawel Jakub Dawidek * * $Id: msgbuf.c,v 1.1.1.1 2003/02/11 12:42:09 jules Exp $ */ #include #include #include #include #include #include extern int name2oid(char *, int *, int *, struct sysctl_oid **); extern int sysctl_kern_msgbuf(SYSCTL_HANDLER_ARGS); extern int sysctl_machdep_msgbuf(SYSCTL_HANDLER_ARGS); static int (*vmb_sysctl_kern_msgbuf)(SYSCTL_HANDLER_ARGS); static int (*vmb_sysctl_machdep_msgbuf)(SYSCTL_HANDLER_ARGS); static struct sysctl_oid *kern_msgbuf_oid; static struct sysctl_oid *machdep_msgbuf_oid; static int fmb_sysctl_kern_msgbuf(SYSCTL_HANDLER_ARGS) { int error; if ((error = suser(curproc)) != 0) return (error); return (vmb_sysctl_kern_msgbuf(oidp, arg1, arg2, req)); } static int fmb_sysctl_machdep_msgbuf(SYSCTL_HANDLER_ARGS) { int error; if ((error = suser(curproc)) != 0) return (error); return (vmb_sysctl_machdep_msgbuf(oidp, arg1, arg2, req)); } static int fmb_sysctls_switch(void) { struct sysctl_oid *oidp; int oid[CTL_MAXNAME], len, error; /* kern.msgbuf */ error = name2oid("kern.msgbuf", oid, &len, &oidp); if (error != 0) { printf("msgbuf: Unexpected error while looking for kern.msgbuf " "sysctl.\n"); return (error); } vmb_sysctl_kern_msgbuf = oidp->oid_handler; oidp->oid_handler = fmb_sysctl_kern_msgbuf; kern_msgbuf_oid = oidp; /* machdep.msgbuf */ error = name2oid("machdep.msgbuf", oid, &len, &oidp); if (error != 0) { printf("msgbuf: Unexpected error while looking for " "machdep.msgbuf sysctl.\n"); return (error); } vmb_sysctl_machdep_msgbuf = oidp->oid_handler; oidp->oid_handler = fmb_sysctl_machdep_msgbuf; machdep_msgbuf_oid = oidp; return (0); } static void fmb_sysctls_backswitch(void) { /* kern.msgbuf */ kern_msgbuf_oid->oid_handler = vmb_sysctl_kern_msgbuf; /* machdep.msgbuf */ machdep_msgbuf_oid->oid_handler = vmb_sysctl_machdep_msgbuf; } static int mod(struct module *module, int cmd, void *arg) { int error; error = 0; switch (cmd) { case MOD_LOAD: error = fmb_sysctls_switch(); if (error != 0) break; log(LOG_INFO, "msgbuf protection loaded.\n"); break; case MOD_UNLOAD: fmb_sysctls_backswitch(); log(LOG_INFO, "msgbuf protection unloaded.\n"); break; default: error = EINVAL; break; } return (error); } static moduledata_t msgbuf_mod = { "msgbuf", mod, NULL }; DECLARE_MODULE(msgbuf, msgbuf_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);