X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=procprotect.c;h=9fdaab3f606117f45dca0f7a244886fe1ba84d18;hb=bc1e99f9399432d94750f7b5dc65d0a1d5eddbae;hp=e22355a51aa425700b0d99c8a5de744f8ec1646f;hpb=f3723cb12d24dddf696c6115c23ee5bc01cd3395;p=procprotect.git diff --git a/procprotect.c b/procprotect.c index e22355a..9fdaab3 100644 --- a/procprotect.c +++ b/procprotect.c @@ -34,11 +34,7 @@ #error "This code does not support your architecture" #endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0) static char *aclpath = "procprotect"; -#else -static char *aclpath __devinitdata = "procprotect"; -#endif static struct qstr aclqpath; @@ -69,11 +65,10 @@ struct hlist_head procprotect_hash[HASH_SIZE]; struct proc_dir_entry *proc_entry; static int run_acl(unsigned long ino) { - struct hlist_node *n; struct acl_entry *entry; hlist_for_each_entry_rcu(entry, - n, &procprotect_hash[ino & (HASH_SIZE-1)], - hlist) { + &procprotect_hash[ino & (HASH_SIZE-1)], + hlist) { if (entry->ino==ino) { return 0; } @@ -90,14 +85,13 @@ static int lookup_fast_entry(struct kretprobe_instance *ri, struct pt_regs *regs int ret = -1; struct procprotect_ctx *ctx; struct nameidata *nd = (struct nameidata *) regs->di; - struct qstr *q = (struct qstr *) regs->si; struct dentry *parent = nd->path.dentry; struct inode *pinode = parent->d_inode; if (pinode->i_sb->s_magic == PROC_SUPER_MAGIC && current->nsproxy->mnt_ns!=init_task.nsproxy->mnt_ns) { ctx = (struct procprotect_ctx *) ri->data; - ctx->inode = regs->cx; + ctx->inode = regs->dx; ctx->flags = nd->flags; ret = 0; } @@ -131,8 +125,7 @@ static int lookup_slow_entry(struct kretprobe_instance *ri, struct pt_regs *regs int ret = -1; struct procprotect_ctx *ctx; struct nameidata *nd = (struct nameidata *) regs->di; - struct qstr *q = (struct qstr *) regs->si; - struct path *p = (struct path *) regs->dx; + struct path *p = (struct path *) regs->si; struct dentry *parent = nd->path.dentry; struct inode *pinode = parent->d_inode; @@ -143,7 +136,7 @@ static int lookup_slow_entry(struct kretprobe_instance *ri, struct pt_regs *regs && current->nsproxy->mnt_ns!=init_task.nsproxy->mnt_ns) { ctx = (struct procprotect_ctx *) ri->data; - ctx->q = q; + ctx->q = &nd->last; ctx->flags = nd->flags; ctx->path = p; ret = 0; @@ -155,18 +148,23 @@ 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 || !ri->data) {return 0;} + ctx = (struct procprotect_ctx *) ri->data; + + 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 || !p->dentry || !p->dentry->d_inode /* This last check was responsible for the f18 bug*/) { + return 0; + } struct inode *inode = p->dentry->d_inode; if (!run_acl(inode->i_ino)) { regs->ax = -EPERM; @@ -249,14 +247,13 @@ static void __exit procprotect_exit(void) unregister_kretprobe(&fast_probe); unregister_kretprobe(&slow_probe); unregister_jprobe(&dolast_probe); - struct hlist_node *n; struct acl_entry *entry; int i; for (i=0;iwrite_proc = procfile_write; + add_entry("/proc/sysrq-trigger"); return ret; }