diff options
| author | Hou Tao <houtao1@huawei.com> | 2022-03-09 20:33:20 +0800 | 
|---|---|---|
| committer | Alexei Starovoitov <ast@kernel.org> | 2022-03-16 15:13:36 -0700 | 
| commit | d2a3b7c5becc3992f8e7d2b9bf5eacceeedb9a48 (patch) | |
| tree | c70bd9195500322ed9bbf0e4b783e9038dc3ffee /kernel/bpf/core.c | |
| parent | 73e14451f39e54f83ea3badb6d6b8a423f901845 (diff) | |
bpf: Fix net.core.bpf_jit_harden race
It is the bpf_jit_harden counterpart to commit 60b58afc96c9 ("bpf: fix
net.core.bpf_jit_enable race"). bpf_jit_harden will be tested twice
for each subprog if there are subprogs in bpf program and constant
blinding may increase the length of program, so when running
"./test_progs -t subprogs" and toggling bpf_jit_harden between 0 and 2,
jit_subprogs may fail because constant blinding increases the length
of subprog instructions during extra passs.
So cache the value of bpf_jit_blinding_enabled() during program
allocation, and use the cached value during constant blinding, subprog
JITing and args tracking of tail call.
Signed-off-by: Hou Tao <houtao1@huawei.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20220309123321.2400262-4-houtao1@huawei.com
Diffstat (limited to 'kernel/bpf/core.c')
| -rw-r--r-- | kernel/bpf/core.c | 3 | 
1 files changed, 2 insertions, 1 deletions
| diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index ab630f773ec1..1324f9523e7c 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -105,6 +105,7 @@ struct bpf_prog *bpf_prog_alloc_no_stats(unsigned int size, gfp_t gfp_extra_flag  	fp->aux = aux;  	fp->aux->prog = fp;  	fp->jit_requested = ebpf_jit_enabled(); +	fp->blinding_requested = bpf_jit_blinding_enabled(fp);  	INIT_LIST_HEAD_RCU(&fp->aux->ksym.lnode);  	mutex_init(&fp->aux->used_maps_mutex); @@ -1382,7 +1383,7 @@ struct bpf_prog *bpf_jit_blind_constants(struct bpf_prog *prog)  	struct bpf_insn *insn;  	int i, rewritten; -	if (!bpf_jit_blinding_enabled(prog) || prog->blinded) +	if (!prog->blinding_requested || prog->blinded)  		return prog;  	clone = bpf_prog_clone_create(prog, GFP_USER); | 
