bpf: fix add/sub min/max estimations
authorKonstantin Ananyev <konstantin.ananyev@intel.com>
Wed, 27 May 2020 14:16:50 +0000 (15:16 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Wed, 24 Jun 2020 21:34:07 +0000 (23:34 +0200)
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: stable@dpdk.org
Signed-off-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
lib/librte_bpf/bpf_validate.c

index 6bd6f78..80d21fa 100644 (file)
@@ -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,