|
@@ -877,6 +877,7 @@ void bpf_jit_compile(struct sk_filter *fp)
|
|
if (jit.start) {
|
|
if (jit.start) {
|
|
set_memory_ro((unsigned long)header, header->pages);
|
|
set_memory_ro((unsigned long)header, header->pages);
|
|
fp->bpf_func = (void *) jit.start;
|
|
fp->bpf_func = (void *) jit.start;
|
|
|
|
+ fp->jited = 1;
|
|
}
|
|
}
|
|
out:
|
|
out:
|
|
kfree(addrs);
|
|
kfree(addrs);
|
|
@@ -887,10 +888,12 @@ void bpf_jit_free(struct sk_filter *fp)
|
|
unsigned long addr = (unsigned long)fp->bpf_func & PAGE_MASK;
|
|
unsigned long addr = (unsigned long)fp->bpf_func & PAGE_MASK;
|
|
struct bpf_binary_header *header = (void *)addr;
|
|
struct bpf_binary_header *header = (void *)addr;
|
|
|
|
|
|
- if (fp->bpf_func == sk_run_filter)
|
|
|
|
|
|
+ if (!fp->jited)
|
|
goto free_filter;
|
|
goto free_filter;
|
|
|
|
+
|
|
set_memory_rw(addr, header->pages);
|
|
set_memory_rw(addr, header->pages);
|
|
module_free(NULL, header);
|
|
module_free(NULL, header);
|
|
|
|
+
|
|
free_filter:
|
|
free_filter:
|
|
kfree(fp);
|
|
kfree(fp);
|
|
}
|
|
}
|