eval_add()/eval_sub() not always correctly estimate
minimum and maximum possible values of add/sub operations.

Fixes: 8021917293d0 ("bpf: add extra validation for input BPF program")
Cc: sta...@dpdk.org

Signed-off-by: Konstantin Ananyev <konstantin.anan...@intel.com>
---
 lib/librte_bpf/bpf_validate.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/lib/librte_bpf/bpf_validate.c b/lib/librte_bpf/bpf_validate.c
index 6bd6f78e9..80d21fabb 100644
--- a/lib/librte_bpf/bpf_validate.c
+++ b/lib/librte_bpf/bpf_validate.c
@@ -226,7 +226,7 @@ eval_add(struct bpf_reg_val *rd, const struct bpf_reg_val 
*rs, uint64_t msk)
        struct bpf_reg_val rv;
 
        rv.u.min = (rd->u.min + rs->u.min) & msk;
-       rv.u.max = (rd->u.min + rs->u.max) & msk;
+       rv.u.max = (rd->u.max + rs->u.max) & msk;
        rv.s.min = (rd->s.min + rs->s.min) & msk;
        rv.s.max = (rd->s.max + rs->s.max) & msk;
 
@@ -254,10 +254,10 @@ eval_sub(struct bpf_reg_val *rd, const struct bpf_reg_val 
*rs, uint64_t msk)
 {
        struct bpf_reg_val rv;
 
-       rv.u.min = (rd->u.min - rs->u.min) & msk;
-       rv.u.max = (rd->u.min - rs->u.max) & msk;
-       rv.s.min = (rd->s.min - rs->s.min) & msk;
-       rv.s.max = (rd->s.max - rs->s.max) & msk;
+       rv.u.min = (rd->u.min - rs->u.max) & msk;
+       rv.u.max = (rd->u.max - rs->u.min) & msk;
+       rv.s.min = (rd->s.min - rs->s.max) & msk;
+       rv.s.max = (rd->s.max - rs->s.min) & msk;
 
        /*
         * if at least one of the operands is not constant,
-- 
2.17.1

Reply via email to