X-Git-Url: http://git.onelab.eu/?p=procprotect.git;a=blobdiff_plain;f=procprotect.c;h=cc5c11793a9bc61ae0f5f57d0c88cec6d8e81e7e;hp=56910b3271669037bbd446ed6797ec773d8accab;hb=c40c7bb97725cfe49729055d5d40901c0d2cda96;hpb=d53194f4cadff25c88ba781da36daeec563226a0 diff --git a/procprotect.c b/procprotect.c index 56910b3..cc5c117 100644 --- a/procprotect.c +++ b/procprotect.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -154,19 +155,47 @@ static int lookup_slow_entry(struct kretprobe_instance *ri, struct pt_regs *regs /* The entry hook ensures that the return hook is only called for accesses to /proc */ +static int print_once = 0; + static int lookup_slow_ret(struct kretprobe_instance *ri, struct pt_regs *regs) { - struct procprotect_ctx *ctx = (struct procprotect_ctx *) ri->data; - int ret = regs->ax; + struct procprotect_ctx *ctx; + int ret; + + if (!ri) {printk(KERN_CRIT "ri is 0x0");/* Race condition?*/ return 0;} + ctx = (struct procprotect_ctx *) ri->data; + + if (!regs) { + if (!print_once++) { + printk(KERN_CRIT "Regs is 0x0"); + } + return 0; + } + + ret = regs->ax; if (ret==0) { - /* The kernel is going to honor the request. Here's where we step in */ - /*struct qstr *q = ctx->q; - if (!strncmp(q->name,"sysrq-trigger",13)) { - printk(KERN_CRIT "lookup_slow sysrqtrigger"); - }*/ struct path *p = ctx->path; + if (!p) { + if (!print_once++) { + printk(KERN_CRIT "P is 0x0"); + } + return 0; + } + if (!p->dentry) { + if (!print_once++) { + printk(KERN_CRIT "P->dentry is 0x0"); + } + return 0; + } + struct inode *inode = p->dentry->d_inode; + if (!inode) { + if (!print_once++) { + printk(KERN_CRIT "inode is 0x0"); + } + return 0; + } if (!run_acl(inode->i_ino)) { regs->ax = -EPERM; } @@ -288,11 +317,12 @@ int procfile_write(struct file *file, const char *buffer, unsigned long count, v static int __init procprotect_init(void) { - printk("Procprotect: starting procprotect version %s with ACLs at path %s.\n", - VERSION_STR, aclpath); int ret; int i; + printk("Procprotect: starting procprotect version %s with ACLs at path %s.\n", + VERSION_STR, aclpath); + for(i=0;i