]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
net: bpf_jit: fix an off-one bug in x86_64 cond jump target
authorMarkus Kötter <nepenthesdev@gmail.com>
Sat, 17 Dec 2011 11:39:08 +0000 (11:39 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 19 Dec 2011 20:47:29 +0000 (15:47 -0500)
x86 jump instruction size is 2 or 5 bytes (near/long jump), not 2 or 6
bytes.

In case a conditional jump is followed by a long jump, conditional jump
target is one byte past the start of target instruction.

Signed-off-by: Markus Kötter <nepenthesdev@gmail.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/x86/net/bpf_jit_comp.c

index bfab3fa10edc63e50b4184d00e75566678242a0d..7b65f752c5f8fd79af2c6b4afb342988bdd8d56c 100644 (file)
@@ -568,8 +568,8 @@ cond_branch:                        f_offset = addrs[i + filter[i].jf] - addrs[i];
                                        break;
                                }
                                if (filter[i].jt != 0) {
-                                       if (filter[i].jf)
-                                               t_offset += is_near(f_offset) ? 2 : 6;
+                                       if (filter[i].jf && f_offset)
+                                               t_offset += is_near(f_offset) ? 2 : 5;
                                        EMIT_COND_JMP(t_op, t_offset);
                                        if (filter[i].jf)
                                                EMIT_JMP(f_offset);