X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=procprotect.c;h=f8ab6e68236ea18bbbdbe48f1eb11081d3cfc2bb;hb=b95f21e08ca45f179b52053eb9cc410cac2bae4e;hp=a56c6b2e07b8981f18a057d2ca5718cf9cb7c40d;hpb=c2ce2b394fbab7dd2b69d410f3389c59fe0368a7;p=procprotect.git diff --git a/procprotect.c b/procprotect.c index a56c6b2..f8ab6e6 100644 --- a/procprotect.c +++ b/procprotect.c @@ -219,6 +219,55 @@ static struct kretprobe slow_probe = { .data_size = sizeof(struct procprotect_ctx) }; +int once_only = 0; + +static int init_probes(void) { + int ret; + dolast_probe.kp.addr = + (kprobe_opcode_t *) kallsyms_lookup_name("do_last"); + + if (!dolast_probe.kp.addr) { + printk("Couldn't find %s to plant kretprobe\n", "do_last"); + return -1; + } + + if ((ret = register_jprobe(&dolast_probe)) <0) { + printk("register_jprobe failed, returned %u\n", ret); + return -1; + } + fast_probe.kp.addr = + (kprobe_opcode_t *) kallsyms_lookup_name("lookup_fast"); + + if (!fast_probe.kp.addr) { + printk("Couldn't find %s to plant kretprobe\n", "lookup_fast"); + return -1; + } + + slow_probe.kp.addr = + (kprobe_opcode_t *) kallsyms_lookup_name("lookup_slow"); + + if (!slow_probe.kp.addr) { + printk("Couldn't find %s to plant kretprobe\n", "lookup_slow"); + return -1; + } + + if ((ret = register_kretprobe(&fast_probe)) <0) { + printk("register_kretprobe failed, returned %d\n", ret); + return -1; + } + + printk("Planted kretprobe at %p, handler addr %p\n", + fast_probe.kp.addr, fast_probe.handler); + + if ((ret = register_kretprobe(&slow_probe)) <0) { + printk("register_kretprobe failed, returned %d\n", ret); + return -1; + } + printk("Planted kretprobe at %p, handler addr %p\n", + slow_probe.kp.addr, slow_probe.handler); + return 0; +} + static void add_entry(char *pathname) { struct path path; if (kern_path(pathname, 0, &path)) { @@ -243,6 +292,7 @@ static void add_entry(char *pathname) { } } } + } @@ -284,6 +334,12 @@ int procfile_write(struct file *file, const char *buffer, unsigned long count, v pathname[count]='\0'; add_entry(pathname); + + if (!once_only) { + once_only=1; + if (init_probes()==-1) + printk(KERN_CRIT "Could not install procprotect probes. Reload module to retry."); + } printk(KERN_CRIT "Length of buffer=%d",strlen(pathname)); return count; } @@ -293,6 +349,7 @@ static const struct file_operations procprotect_fops = { .write = procfile_write }; + static int __init procprotect_init(void) { int ret; @@ -305,56 +362,9 @@ static int __init procprotect_init(void) INIT_HLIST_HEAD(&procprotect_hash[i]); } - add_entry("/proc/sysrq-trigger"); - aclqpath.name = aclpath; aclqpath.len = strnlen(aclpath, PATH_MAX); - dolast_probe.kp.addr = - (kprobe_opcode_t *) kallsyms_lookup_name("do_last"); - - if (!dolast_probe.kp.addr) { - printk("Couldn't find %s to plant kretprobe\n", "do_last"); - return -1; - } - - if ((ret = register_jprobe(&dolast_probe)) <0) { - printk("register_jprobe failed, returned %u\n", ret); - return -1; - } - fast_probe.kp.addr = - (kprobe_opcode_t *) kallsyms_lookup_name("lookup_fast"); - - if (!fast_probe.kp.addr) { - printk("Couldn't find %s to plant kretprobe\n", "lookup_fast"); - return -1; - } - - slow_probe.kp.addr = - (kprobe_opcode_t *) kallsyms_lookup_name("lookup_slow"); - - if (!slow_probe.kp.addr) { - printk("Couldn't find %s to plant kretprobe\n", "lookup_slow"); - return -1; - } - - - - if ((ret = register_kretprobe(&fast_probe)) <0) { - printk("register_kretprobe failed, returned %d\n", ret); - return -1; - } - - printk("Planted kretprobe at %p, handler addr %p\n", - fast_probe.kp.addr, fast_probe.handler); - - if ((ret = register_kretprobe(&slow_probe)) <0) { - printk("register_kretprobe failed, returned %d\n", ret); - return -1; - } - printk("Planted kretprobe at %p, handler addr %p\n", - slow_probe.kp.addr, slow_probe.handler); - proc_entry = proc_create("procprotect", 0644, NULL, &procprotect_fops); return ret;