mirror of https://gitee.com/openkylin/linux.git
net: bpf: be friendly to kmemcheck
Reported by Mikulas Patocka, kmemcheck currently barks out a false positive since we don't have special kmemcheck annotation for bitfields used in bpf_prog structure. We currently have jited:1, len:31 and thus when accessing len while CONFIG_KMEMCHECK enabled, kmemcheck throws a warning that we're reading uninitialized memory. As we don't need the whole bit universe for pages member, we can just split it to u16 and use a bool flag for jited instead of a bitfield. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Daniel Borkmann <dborkman@redhat.com> Acked-by: Alexei Starovoitov <ast@plumgrid.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
55309dd3d4
commit
286aad3c40
|
@ -933,7 +933,7 @@ void bpf_jit_compile(struct bpf_prog *fp)
|
|||
|
||||
set_memory_ro((unsigned long)header, header->pages);
|
||||
fp->bpf_func = (void *)ctx.target;
|
||||
fp->jited = 1;
|
||||
fp->jited = true;
|
||||
out:
|
||||
kfree(ctx.offsets);
|
||||
return;
|
||||
|
|
|
@ -1417,7 +1417,7 @@ void bpf_jit_compile(struct bpf_prog *fp)
|
|||
bpf_jit_dump(fp->len, alloc_size, 2, ctx.target);
|
||||
|
||||
fp->bpf_func = (void *)ctx.target;
|
||||
fp->jited = 1;
|
||||
fp->jited = true;
|
||||
|
||||
out:
|
||||
kfree(ctx.offsets);
|
||||
|
|
|
@ -686,7 +686,7 @@ void bpf_jit_compile(struct bpf_prog *fp)
|
|||
((u64 *)image)[0] = (u64)code_base;
|
||||
((u64 *)image)[1] = local_paca->kernel_toc;
|
||||
fp->bpf_func = (void *)image;
|
||||
fp->jited = 1;
|
||||
fp->jited = true;
|
||||
}
|
||||
out:
|
||||
kfree(addrs);
|
||||
|
|
|
@ -842,7 +842,7 @@ void bpf_jit_compile(struct bpf_prog *fp)
|
|||
if (jit.start) {
|
||||
set_memory_ro((unsigned long)header, header->pages);
|
||||
fp->bpf_func = (void *) jit.start;
|
||||
fp->jited = 1;
|
||||
fp->jited = true;
|
||||
}
|
||||
out:
|
||||
kfree(addrs);
|
||||
|
|
|
@ -801,7 +801,7 @@ cond_branch: f_offset = addrs[i + filter[i].jf];
|
|||
if (image) {
|
||||
bpf_flush_icache(image, image + proglen);
|
||||
fp->bpf_func = (void *)image;
|
||||
fp->jited = 1;
|
||||
fp->jited = true;
|
||||
}
|
||||
out:
|
||||
kfree(addrs);
|
||||
|
|
|
@ -955,7 +955,7 @@ void bpf_int_jit_compile(struct bpf_prog *prog)
|
|||
bpf_flush_icache(header, image + proglen);
|
||||
set_memory_ro((unsigned long)header, header->pages);
|
||||
prog->bpf_func = (void *)image;
|
||||
prog->jited = 1;
|
||||
prog->jited = true;
|
||||
}
|
||||
out:
|
||||
kfree(addrs);
|
||||
|
|
|
@ -300,9 +300,9 @@ struct bpf_work_struct {
|
|||
};
|
||||
|
||||
struct bpf_prog {
|
||||
u32 pages; /* Number of allocated pages */
|
||||
u32 jited:1, /* Is our filter JIT'ed? */
|
||||
len:31; /* Number of filter blocks */
|
||||
u16 pages; /* Number of allocated pages */
|
||||
bool jited; /* Is our filter JIT'ed? */
|
||||
u32 len; /* Number of filter blocks */
|
||||
struct sock_fprog_kern *orig_prog; /* Original BPF program */
|
||||
struct bpf_work_struct *work; /* Deferred free work struct */
|
||||
unsigned int (*bpf_func)(const struct sk_buff *skb,
|
||||
|
|
|
@ -972,7 +972,7 @@ static struct bpf_prog *bpf_prepare_filter(struct bpf_prog *fp)
|
|||
int err;
|
||||
|
||||
fp->bpf_func = NULL;
|
||||
fp->jited = 0;
|
||||
fp->jited = false;
|
||||
|
||||
err = bpf_check_classic(fp->insns, fp->len);
|
||||
if (err) {
|
||||
|
|
Loading…
Reference in New Issue