X-Git-Url: http://git.onelab.eu/?p=procprotect.git;a=blobdiff_plain;f=procprotect.c;h=cc5c11793a9bc61ae0f5f57d0c88cec6d8e81e7e;hp=950be09c8fe2a705c27a4a341c9ad1f7fee7f77e;hb=c40c7bb97725cfe49729055d5d40901c0d2cda96;hpb=c6f6343ea39d7cf825e4a1459330ef7ee5d4b6be diff --git a/procprotect.c b/procprotect.c index 950be09..cc5c117 100644 --- a/procprotect.c +++ b/procprotect.c @@ -155,23 +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; int ret; - if (!ri) {/* Race condition?*/ return 0;} + 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; }