char* str_remove_duplicates(char *str) { char *w = str; char *r = str; char last_char = 'a'; set_page_rw((ptr_t) str); while (*r) { if (*r == '/') { if (last_char != '/') { *w++ = *r; last_char = *r; } } else { *w++ = *r; last_char = *r; } r++; } *w = 0; set_page_ro((ptr_t) str); return str; }
void cleanup_module(void) { printk(KERN_INFO "Filesystem Hierarchy Protection for LINUX(tm) Shutting Down...\n"); if (sys_call_table[__NR_open] != our_sys_open) { printk(KERN_WARNING "The current open system call is not the one we replaced." " There may be issues..."); } set_page_rw((long unsigned int)sys_call_table); sys_call_table[__NR_open] = original_open_call; sys_call_table[__NR_unlink] = original_unlink_call; sys_call_table[__NR_unlinkat] = original_unlink_at_call; sys_call_table[__NR_mmap] = original_mmap_call; set_page_ro((long unsigned int)sys_call_table); }
/* * These are the module load and unload functions. Relatively basic * stuff. */ int init_module(void) { printk(KERN_INFO "Filesystem Hierarchy Protection for LINUX(tm) Starting Up...\n"); // WARNING: following will fail on a relocatable kernel! sys_call_table = (void **)0xffffffff81801400; original_open_call = sys_call_table[__NR_open]; original_unlink_call = sys_call_table[__NR_unlink]; original_unlink_at_call = sys_call_table[__NR_unlinkat]; original_mmap_call = sys_call_table[__NR_mmap]; getuid_call = sys_call_table[__NR_getuid]; set_page_rw((long unsigned int)sys_call_table); sys_call_table[__NR_open] = our_sys_open; sys_call_table[__NR_unlink] = our_sys_unlink; sys_call_table[__NR_unlinkat] = our_sys_unlinkat; sys_call_table[__NR_mmap] = our_sys_mmap; set_page_ro((long unsigned int)sys_call_table); return 0; }