powerpc/bpf: Skip branch range validation during first pass
authorNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Mon, 14 Feb 2022 10:41:35 +0000 (16:11 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 7 Mar 2022 13:04:57 +0000 (00:04 +1100)
During the first pass, addrs[] is still being populated. So, all
branches to following instructions will appear to be going to the start
of the JIT program. Ignore branch range validation for such instructions
and assume those to be in range. Branch range validation will happen
during the second pass after addrs[] is setup properly.

Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/bc517413d11636e20dbfc88503dad14bcbe391e2.1644834730.git.naveen.n.rao@linux.vnet.ibm.com
arch/powerpc/net/bpf_jit.h

index b75507fc8f6b0b08024febb0bf1b17c68507257e..25a7190bcee95df0763a057b38934714072b6ab5 100644 (file)
@@ -27,7 +27,7 @@
 #define PPC_JMP(dest)                                                        \
        do {                                                                  \
                long offset = (long)(dest) - (ctx->idx * 4);                  \
-               if (!is_offset_in_branch_range(offset)) {                     \
+               if ((dest) != 0 && !is_offset_in_branch_range(offset)) {                      \
                        pr_err_ratelimited("Branch offset 0x%lx (@%u) out of range\n", offset, ctx->idx);                       \
                        return -ERANGE;                                       \
                }                                                             \
@@ -41,7 +41,7 @@
 #define PPC_BCC_SHORT(cond, dest)                                            \
        do {                                                                  \
                long offset = (long)(dest) - (ctx->idx * 4);                  \
-               if (!is_offset_in_cond_branch_range(offset)) {                \
+               if ((dest) != 0 && !is_offset_in_cond_branch_range(offset)) {                 \
                        pr_err_ratelimited("Conditional branch offset 0x%lx (@%u) out of range\n", offset, ctx->idx);           \
                        return -ERANGE;                                       \
                }                                                             \