X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=procprotect.c;h=1d914015e0d4de5a8cd91a3e7f4047c8f37c656f;hb=3fade9a394c2d4a55abb11ba76bf2ef75744caab;hp=0c8f251e914dca1cee1f9300ab4fc5750910c35a;hpb=738d7a684187ffa9fad16e8cc46e441aca3a903b;p=procprotect.git diff --git a/procprotect.c b/procprotect.c index 0c8f251..1d91401 100644 --- a/procprotect.c +++ b/procprotect.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -33,7 +34,12 @@ #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; module_param(aclpath, charp, 0); @@ -63,11 +69,16 @@ struct hlist_head procprotect_hash[HASH_SIZE]; struct proc_dir_entry *proc_entry; static int run_acl(unsigned long ino) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0) struct hlist_node *n; +#endif struct acl_entry *entry; hlist_for_each_entry_rcu(entry, - n, &procprotect_hash[ino & (HASH_SIZE-1)], - hlist) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0) + n, +#endif + &procprotect_hash[ino & (HASH_SIZE-1)], + hlist) { if (entry->ino==ino) { return 0; } @@ -149,18 +160,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; @@ -243,14 +259,19 @@ static void __exit procprotect_exit(void) unregister_kretprobe(&fast_probe); unregister_kretprobe(&slow_probe); unregister_jprobe(&dolast_probe); +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0) struct hlist_node *n; +#endif struct acl_entry *entry; int i; for (i=0;i