X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=procprotect.c;h=a56c6b2e07b8981f18a057d2ca5718cf9cb7c40d;hb=c2ce2b394fbab7dd2b69d410f3389c59fe0368a7;hp=4763e1713e4c1fbd2f8a18a0e162652ac1fd9313;hpb=e86258a533beb4e2d7e7d0372a1048e88b611a06;p=procprotect.git diff --git a/procprotect.c b/procprotect.c index 4763e17..a56c6b2 100644 --- a/procprotect.c +++ b/procprotect.c @@ -28,17 +28,19 @@ #include #include +#include +#include +#include /* Specifically, a module */ +#include /* We're doing kernel work */ +#include /* Necessary because we use the proc fs */ + #define VERSION_STR "0.0.1" #ifndef CONFIG_X86_64 #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; @@ -62,18 +64,17 @@ struct acl_entry { struct hlist_node hlist; }; -#define HASH_SIZE (1<<16) +#define HASH_SIZE (1<<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) { + hlist_for_each_entry_rcu_notrace(entry, + &procprotect_hash[ino & (HASH_SIZE-1)], + hlist) { if (entry->ino==ino) { return 0; } @@ -90,14 +91,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,19 +131,16 @@ 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; - - 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->q = q; + ctx->q = &nd->last; ctx->flags = nd->flags; ctx->path = p; ret = 0; @@ -253,15 +250,14 @@ static void __exit procprotect_exit(void) { unregister_kretprobe(&fast_probe); unregister_kretprobe(&slow_probe); - unregister_jprobe(&dolast_probe); - struct hlist_node *n; + unregister_jprobe(&dolast_probe); struct acl_entry *entry; int i; for (i=0;iwrite_proc = procfile_write; + proc_entry = proc_create("procprotect", 0644, NULL, &procprotect_fops); return ret; }