root/tools/testing/selftests/bpf/verifier/div_overflow.c

/* [<][>][^][v][top][bottom][index][help] */
   1 /* Just make sure that JITs used udiv/umod as otherwise we get
   2  * an exception from INT_MIN/-1 overflow similarly as with div
   3  * by zero.
   4  */
   5 {
   6         "DIV32 overflow, check 1",
   7         .insns = {
   8         BPF_MOV32_IMM(BPF_REG_1, -1),
   9         BPF_MOV32_IMM(BPF_REG_0, INT_MIN),
  10         BPF_ALU32_REG(BPF_DIV, BPF_REG_0, BPF_REG_1),
  11         BPF_EXIT_INSN(),
  12         },
  13         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  14         .result = ACCEPT,
  15         .retval = 0,
  16 },
  17 {
  18         "DIV32 overflow, check 2",
  19         .insns = {
  20         BPF_MOV32_IMM(BPF_REG_0, INT_MIN),
  21         BPF_ALU32_IMM(BPF_DIV, BPF_REG_0, -1),
  22         BPF_EXIT_INSN(),
  23         },
  24         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  25         .result = ACCEPT,
  26         .retval = 0,
  27 },
  28 {
  29         "DIV64 overflow, check 1",
  30         .insns = {
  31         BPF_MOV64_IMM(BPF_REG_1, -1),
  32         BPF_LD_IMM64(BPF_REG_2, LLONG_MIN),
  33         BPF_ALU64_REG(BPF_DIV, BPF_REG_2, BPF_REG_1),
  34         BPF_MOV32_IMM(BPF_REG_0, 0),
  35         BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_2, 1),
  36         BPF_MOV32_IMM(BPF_REG_0, 1),
  37         BPF_EXIT_INSN(),
  38         },
  39         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  40         .result = ACCEPT,
  41         .retval = 0,
  42 },
  43 {
  44         "DIV64 overflow, check 2",
  45         .insns = {
  46         BPF_LD_IMM64(BPF_REG_1, LLONG_MIN),
  47         BPF_ALU64_IMM(BPF_DIV, BPF_REG_1, -1),
  48         BPF_MOV32_IMM(BPF_REG_0, 0),
  49         BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_1, 1),
  50         BPF_MOV32_IMM(BPF_REG_0, 1),
  51         BPF_EXIT_INSN(),
  52         },
  53         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  54         .result = ACCEPT,
  55         .retval = 0,
  56 },
  57 {
  58         "MOD32 overflow, check 1",
  59         .insns = {
  60         BPF_MOV32_IMM(BPF_REG_1, -1),
  61         BPF_MOV32_IMM(BPF_REG_0, INT_MIN),
  62         BPF_ALU32_REG(BPF_MOD, BPF_REG_0, BPF_REG_1),
  63         BPF_EXIT_INSN(),
  64         },
  65         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  66         .result = ACCEPT,
  67         .retval = INT_MIN,
  68 },
  69 {
  70         "MOD32 overflow, check 2",
  71         .insns = {
  72         BPF_MOV32_IMM(BPF_REG_0, INT_MIN),
  73         BPF_ALU32_IMM(BPF_MOD, BPF_REG_0, -1),
  74         BPF_EXIT_INSN(),
  75         },
  76         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  77         .result = ACCEPT,
  78         .retval = INT_MIN,
  79 },
  80 {
  81         "MOD64 overflow, check 1",
  82         .insns = {
  83         BPF_MOV64_IMM(BPF_REG_1, -1),
  84         BPF_LD_IMM64(BPF_REG_2, LLONG_MIN),
  85         BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
  86         BPF_ALU64_REG(BPF_MOD, BPF_REG_2, BPF_REG_1),
  87         BPF_MOV32_IMM(BPF_REG_0, 0),
  88         BPF_JMP_REG(BPF_JNE, BPF_REG_3, BPF_REG_2, 1),
  89         BPF_MOV32_IMM(BPF_REG_0, 1),
  90         BPF_EXIT_INSN(),
  91         },
  92         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
  93         .result = ACCEPT,
  94         .retval = 1,
  95 },
  96 {
  97         "MOD64 overflow, check 2",
  98         .insns = {
  99         BPF_LD_IMM64(BPF_REG_2, LLONG_MIN),
 100         BPF_MOV64_REG(BPF_REG_3, BPF_REG_2),
 101         BPF_ALU64_IMM(BPF_MOD, BPF_REG_2, -1),
 102         BPF_MOV32_IMM(BPF_REG_0, 0),
 103         BPF_JMP_REG(BPF_JNE, BPF_REG_3, BPF_REG_2, 1),
 104         BPF_MOV32_IMM(BPF_REG_0, 1),
 105         BPF_EXIT_INSN(),
 106         },
 107         .prog_type = BPF_PROG_TYPE_SCHED_CLS,
 108         .result = ACCEPT,
 109         .retval = 1,
 110 },

/* [<][>][^][v][top][bottom][index][help] */