Patch "bpf: adjust insn_aux_data when patching insns" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
bpf: adjust insn_aux_data when patching insns
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
bpf-adjust-insn_aux_data-when-patching-insns.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
8041902dae5299c1f194ba42d14383f734631009Mon Sep 17 00:00:00 2001
From: Alexei Starovoitov <[email protected]>
Date: Wed, 15 Mar 2017 18:26:41 -0700
Subject: bpf: adjust insn_aux_data when patching insns
From: Alexei Starovoitov <[email protected]>
commit 8041902dae5299c1f194ba42d14383f734631009 upstream.
convert_ctx_accesses() replaces single bpf instruction with a set of instructions. Adjust corresponding insn_aux_data while patching. It's needed to make sure subsequent 'for(all insn)' loops have matching insn and insn_aux_data.
--- kernel/bpf/verifier.c | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-)
kernel/bpf/verifier.c +37 -3
@@ -2107,6 +2107,41 @@ static void convert_pseudo_ld_imm64(stru insn->src_reg =0 ; } +/* single env->prog->insni[off] instruction was replaced with the range +* insni[off, off + cnt). Adjust corresponding insn_aux_data by copying +* [0, off) and [off, end) to new locations, so the patched range stays zero +*/ +static int adjust_insn_aux_data (struct verifier_env *env,u32 prog_len, +u32 off,u32 cnt) +{ +struct bpf_insn_aux_data *new_data, *old_data = env->insn_aux_data; + +if (cnt ==1 ) +return 0 ; + new_data =vzalloc (sizeof (struct bpf_insn_aux_data ) * prog_len); +if (!new_data) +return -ENOMEM ; +memcpy (new_data, old_data,sizeof (struct bpf_insn_aux_data ) * off); +memcpy (new_data + off + cnt -1 , old_data + off, +sizeof (struct bpf_insn_aux_data ) * (prog_len - off - cnt +1 )); + env->insn_aux_data = new_data; +vfree (old_data); +return 0 ; +} + +static struct bpf_prog *bpf_patch_insn_data (struct verifier_env *env,u32 off, +const struct bpf_insn *patch,u32 len) +{ +struct bpf_prog *new_prog; + + new_prog =bpf_patch_insn_single (env->prog, off, patch, len); +if (!new_prog) +return NULL ; +if (adjust_insn_aux_data (env, new_prog->len, off, len)) +return NULL ; +return new_prog; +} +/* convert load instructions that access fields of 'struct __sk_buff' * into sequence of instructions that access fields of 'struct sk_buff' */
@@ -2132,7 +2167,7 @@ static int convert_ctx_accesses(struct velse continue ; -if (env->insn_aux_data[i].ptr_type !=PTR_TO_CTX ) +if (env->insn_aux_data[i + delta].ptr_type !=PTR_TO_CTX )continue ; cnt = env->prog->aux->ops->
@@ -2143,8 +2178,7 @@ static int convert_ctx_accesses(struct vreturn -EINVAL ; } - new_prog =bpf_patch_insn_single (env->prog, i + delta, insn_buf, - cnt); + new_prog =bpf_patch_insn_data (env, i + delta, insn_buf, cnt);if (!new_prog)return -ENOMEM ;
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/bpf-adjust-insn_aux_data-when-patching-insns.patch queue-4.4/bpf-refactor-fixup_bpf_calls.patch queue-4.4/bpf-move-fixup_bpf_calls-function.patch