ARM: net: fix condition for load_order > 0 when translating load instructions.
authorNicolas Schichan <nschichan@freebox.fr>
Tue, 21 Jul 2015 12:14:12 +0000 (14:14 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 22 Jul 2015 05:19:55 +0000 (22:19 -0700)
To check whether the load should take the fast path or not, the code
would check that (r_skb_hlen - load_order) is greater than the offset
of the access using an "Unsigned higher or same" condition. For
halfword accesses and an skb length of 1 at offset 0, that test is
valid, as we end up comparing 0xffffffff(-1) and 0, so the fast path
is taken and the filter allows the load to wrongly succeed. A similar
issue exists for word loads at offset 0 and an skb length of less than
4.

Fix that by using the condition "Signed greater than or equal"
condition for the fast path code for load orders greater than 0.

Signed-off-by: Nicolas Schichan <nschichan@freebox.fr>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/arm/net/bpf_jit_32.c

index 4550d247e308be128b439b0735d853f4745f3618..21f5ace156fd4b82f167237525db7a6a2a6e5523 100644 (file)
@@ -547,7 +547,7 @@ load_common:
                                emit(ARM_SUB_I(r_scratch, r_skb_hl,
                                               1 << load_order), ctx);
                                emit(ARM_CMP_R(r_scratch, r_off), ctx);
-                               condt = ARM_COND_HS;
+                               condt = ARM_COND_GE;
                        } else {
                                emit(ARM_CMP_R(r_skb_hl, r_off), ctx);
                                condt = ARM_COND_HI;