Patch "bpf/verifier: fix min/max handling in BPF_SUB" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
bpf/verifier: fix min/max handling in BPF_SUB
to the 4.9-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-verifier-fix-min-max-handling-in-bpf_sub.patch
and it can be found in the queue-4.9 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 foo@baz Thu Aug 24 17:44:02 PDT 2017
From: Edward Cree <[email protected]>
Date: Fri, 21 Jul 2017 14:37:34 +0100
Subject: bpf/verifier: fix min/max handling in BPF_SUB
From: Edward Cree <[email protected]>
[ Upstream commit 9305706c2e808ae59f1eb201867f82f1ddf6d7a6 ]
We have to subtract the src max from the dst min, and vice-versa, since
(e.g.) the smallest result comes from the largest subtrahend.
--- kernel/bpf/verifier.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)
kernel/bpf/verifier.c +15 -6
@@ -1624,10 +1624,12 @@ static void adjust_reg_min_max_vals(stru* do our normal operations to the register, we need to set the values * to the min/max since they are undefined. */ -if (min_val ==BPF_REGISTER_MIN_RANGE ) - dst_reg->min_value =BPF_REGISTER_MIN_RANGE ; -if (max_val ==BPF_REGISTER_MAX_RANGE ) - dst_reg->max_value =BPF_REGISTER_MAX_RANGE ; +if (opcode !=BPF_SUB ) { +if (min_val ==BPF_REGISTER_MIN_RANGE ) + dst_reg->min_value =BPF_REGISTER_MIN_RANGE ; +if (max_val ==BPF_REGISTER_MAX_RANGE ) + dst_reg->max_value =BPF_REGISTER_MAX_RANGE ; + }switch (opcode) {case BPF_ADD :
@@ -1637,10 +1639,17 @@ static void adjust_reg_min_max_vals(stru dst_reg->max_value += max_val;break ;case BPF_SUB : +/* If one of our values was at the end of our ranges, then the +* _opposite_ value in the dst_reg goes to the end of our range. +*/ +if (min_val ==BPF_REGISTER_MIN_RANGE ) + dst_reg->max_value =BPF_REGISTER_MAX_RANGE ; +if (max_val ==BPF_REGISTER_MAX_RANGE ) + dst_reg->min_value =BPF_REGISTER_MIN_RANGE ;if (dst_reg->min_value !=BPF_REGISTER_MIN_RANGE ) - dst_reg->min_value -= min_val; + dst_reg->min_value -= max_val;if (dst_reg->max_value !=BPF_REGISTER_MAX_RANGE ) - dst_reg->max_value -= max_val; + dst_reg->max_value -= min_val;break ;case BPF_MUL :if (dst_reg->min_value !=BPF_REGISTER_MIN_RANGE )
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/bpf-fix-mixed-signed-unsigned-derived-min-max-value-bounds.patch queue-4.9/bpf-verifier-fix-min-max-handling-in-bpf_sub.patch