| @@ -23,6 +23,7 @@ · 22 unmodified lines |
| 23 | 23 | #include <stdbool.h> |
| 24 | 24 | #include <sched.h> |
| 25 | 25 | #include <limits.h> |
| 26 | +#include <assert.h> |
| 26 | 27 | |
| 27 | 28 | #include <sys/capability.h> |
| 28 | 29 | |
| @@ -2577,6 +2578,7 @@ static struct bpf_test tests[] = { · 2548 unmodified lines |
| 2577 | 2578 | }, |
| 2578 | 2579 | .result = REJECT, |
| 2579 | 2580 | .errstr = "invalid stack off=-79992 size=8", |
| 2581 | + .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", |
| 2580 | 2582 | }, |
| 2581 | 2583 | { |
| 2582 | 2584 | "PTR_TO_STACK store/load - out of bounds high", |
| @@ -3104,6 +3106,8 @@ static struct bpf_test tests[] = { · 521 unmodified lines |
| 3104 | 3106 | BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8), |
| 3105 | 3107 | BPF_EXIT_INSN(), |
| 3106 | 3108 | }, |
| 3109 | + .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", |
| 3110 | + .result_unpriv = REJECT, |
| 3107 | 3111 | .result = ACCEPT, |
| 3108 | 3112 | }, |
| 3109 | 3113 | { |
| @@ -3205,6 +3209,243 @@ static struct bpf_test tests[] = { · 95 unmodified lines |
| 3205 | 3209 | /* Verifier rewrite for unpriv skips tail call here. */ |
| 3206 | 3210 | .retval_unpriv = 2, |
| 3207 | 3211 | }, |
| 3212 | + { |
| 3213 | + "PTR_TO_STACK check high 1", |
| 3214 | + .insns = { |
| 3215 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3216 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1), |
| 3217 | + BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), |
| 3218 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), |
| 3219 | + BPF_EXIT_INSN(), |
| 3220 | + }, |
| 3221 | + .result = ACCEPT, |
| 3222 | + .retval = 42, |
| 3223 | + }, |
| 3224 | + { |
| 3225 | + "PTR_TO_STACK check high 2", |
| 3226 | + .insns = { |
| 3227 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3228 | + BPF_ST_MEM(BPF_B, BPF_REG_1, -1, 42), |
| 3229 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, -1), |
| 3230 | + BPF_EXIT_INSN(), |
| 3231 | + }, |
| 3232 | + .result = ACCEPT, |
| 3233 | + .retval = 42, |
| 3234 | + }, |
| 3235 | + { |
| 3236 | + "PTR_TO_STACK check high 3", |
| 3237 | + .insns = { |
| 3238 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3239 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0), |
| 3240 | + BPF_ST_MEM(BPF_B, BPF_REG_1, -1, 42), |
| 3241 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, -1), |
| 3242 | + BPF_EXIT_INSN(), |
| 3243 | + }, |
| 3244 | + .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", |
| 3245 | + .result_unpriv = REJECT, |
| 3246 | + .result = ACCEPT, |
| 3247 | + .retval = 42, |
| 3248 | + }, |
| 3249 | + { |
| 3250 | + "PTR_TO_STACK check high 4", |
| 3251 | + .insns = { |
| 3252 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3253 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 0), |
| 3254 | + BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), |
| 3255 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), |
| 3256 | + BPF_EXIT_INSN(), |
| 3257 | + }, |
| 3258 | + .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", |
| 3259 | + .errstr = "invalid stack off=0 size=1", |
| 3260 | + .result = REJECT, |
| 3261 | + }, |
| 3262 | + { |
| 3263 | + "PTR_TO_STACK check high 5", |
| 3264 | + .insns = { |
| 3265 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3266 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1), |
| 3267 | + BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), |
| 3268 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), |
| 3269 | + BPF_EXIT_INSN(), |
| 3270 | + }, |
| 3271 | + .result = REJECT, |
| 3272 | + .errstr = "invalid stack off", |
| 3273 | + }, |
| 3274 | + { |
| 3275 | + "PTR_TO_STACK check high 6", |
| 3276 | + .insns = { |
| 3277 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3278 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1), |
| 3279 | + BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MAX, 42), |
| 3280 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MAX), |
| 3281 | + BPF_EXIT_INSN(), |
| 3282 | + }, |
| 3283 | + .result = REJECT, |
| 3284 | + .errstr = "invalid stack off", |
| 3285 | + }, |
| 3286 | + { |
| 3287 | + "PTR_TO_STACK check high 7", |
| 3288 | + .insns = { |
| 3289 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3290 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1), |
| 3291 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, (1 << 29) - 1), |
| 3292 | + BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MAX, 42), |
| 3293 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MAX), |
| 3294 | + BPF_EXIT_INSN(), |
| 3295 | + }, |
| 3296 | + .result = REJECT, |
| 3297 | + .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", |
| 3298 | + .errstr = "fp pointer offset", |
| 3299 | + }, |
| 3300 | + { |
| 3301 | + "PTR_TO_STACK check low 1", |
| 3302 | + .insns = { |
| 3303 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3304 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -512), |
| 3305 | + BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), |
| 3306 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), |
| 3307 | + BPF_EXIT_INSN(), |
| 3308 | + }, |
| 3309 | + .result = ACCEPT, |
| 3310 | + .retval = 42, |
| 3311 | + }, |
| 3312 | + { |
| 3313 | + "PTR_TO_STACK check low 2", |
| 3314 | + .insns = { |
| 3315 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3316 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -513), |
| 3317 | + BPF_ST_MEM(BPF_B, BPF_REG_1, 1, 42), |
| 3318 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 1), |
| 3319 | + BPF_EXIT_INSN(), |
| 3320 | + }, |
| 3321 | + .result_unpriv = REJECT, |
| 3322 | + .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", |
| 3323 | + .result = ACCEPT, |
| 3324 | + .retval = 42, |
| 3325 | + }, |
| 3326 | + { |
| 3327 | + "PTR_TO_STACK check low 3", |
| 3328 | + .insns = { |
| 3329 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3330 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -513), |
| 3331 | + BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), |
| 3332 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), |
| 3333 | + BPF_EXIT_INSN(), |
| 3334 | + }, |
| 3335 | + .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", |
| 3336 | + .errstr = "invalid stack off=-513 size=1", |
| 3337 | + .result = REJECT, |
| 3338 | + }, |
| 3339 | + { |
| 3340 | + "PTR_TO_STACK check low 4", |
| 3341 | + .insns = { |
| 3342 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3343 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, INT_MIN), |
| 3344 | + BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), |
| 3345 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), |
| 3346 | + BPF_EXIT_INSN(), |
| 3347 | + }, |
| 3348 | + .result = REJECT, |
| 3349 | + .errstr = "math between fp pointer", |
| 3350 | + }, |
| 3351 | + { |
| 3352 | + "PTR_TO_STACK check low 5", |
| 3353 | + .insns = { |
| 3354 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3355 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)), |
| 3356 | + BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), |
| 3357 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), |
| 3358 | + BPF_EXIT_INSN(), |
| 3359 | + }, |
| 3360 | + .result = REJECT, |
| 3361 | + .errstr = "invalid stack off", |
| 3362 | + }, |
| 3363 | + { |
| 3364 | + "PTR_TO_STACK check low 6", |
| 3365 | + .insns = { |
| 3366 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3367 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)), |
| 3368 | + BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MIN, 42), |
| 3369 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MIN), |
| 3370 | + BPF_EXIT_INSN(), |
| 3371 | + }, |
| 3372 | + .result = REJECT, |
| 3373 | + .errstr = "invalid stack off", |
| 3374 | + }, |
| 3375 | + { |
| 3376 | + "PTR_TO_STACK check low 7", |
| 3377 | + .insns = { |
| 3378 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3379 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)), |
| 3380 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -((1 << 29) - 1)), |
| 3381 | + BPF_ST_MEM(BPF_B, BPF_REG_1, SHRT_MIN, 42), |
| 3382 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, SHRT_MIN), |
| 3383 | + BPF_EXIT_INSN(), |
| 3384 | + }, |
| 3385 | + .result = REJECT, |
| 3386 | + .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", |
| 3387 | + .errstr = "fp pointer offset", |
| 3388 | + }, |
| 3389 | + { |
| 3390 | + "PTR_TO_STACK mixed reg/k, 1", |
| 3391 | + .insns = { |
| 3392 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3393 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -3), |
| 3394 | + BPF_MOV64_IMM(BPF_REG_2, -3), |
| 3395 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), |
| 3396 | + BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), |
| 3397 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), |
| 3398 | + BPF_EXIT_INSN(), |
| 3399 | + }, |
| 3400 | + .result = ACCEPT, |
| 3401 | + .retval = 42, |
| 3402 | + }, |
| 3403 | + { |
| 3404 | + "PTR_TO_STACK mixed reg/k, 2", |
| 3405 | + .insns = { |
| 3406 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 3407 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0), |
| 3408 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3409 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -3), |
| 3410 | + BPF_MOV64_IMM(BPF_REG_2, -3), |
| 3411 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), |
| 3412 | + BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), |
| 3413 | + BPF_MOV64_REG(BPF_REG_5, BPF_REG_10), |
| 3414 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_5, -6), |
| 3415 | + BPF_EXIT_INSN(), |
| 3416 | + }, |
| 3417 | + .result = ACCEPT, |
| 3418 | + .retval = 42, |
| 3419 | + }, |
| 3420 | + { |
| 3421 | + "PTR_TO_STACK mixed reg/k, 3", |
| 3422 | + .insns = { |
| 3423 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3424 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -3), |
| 3425 | + BPF_MOV64_IMM(BPF_REG_2, -3), |
| 3426 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), |
| 3427 | + BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), |
| 3428 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), |
| 3429 | + BPF_EXIT_INSN(), |
| 3430 | + }, |
| 3431 | + .result = ACCEPT, |
| 3432 | + .retval = -3, |
| 3433 | + }, |
| 3434 | + { |
| 3435 | + "PTR_TO_STACK reg", |
| 3436 | + .insns = { |
| 3437 | + BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), |
| 3438 | + BPF_MOV64_IMM(BPF_REG_2, -3), |
| 3439 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2), |
| 3440 | + BPF_ST_MEM(BPF_B, BPF_REG_1, 0, 42), |
| 3441 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), |
| 3442 | + BPF_EXIT_INSN(), |
| 3443 | + }, |
| 3444 | + .result_unpriv = REJECT, |
| 3445 | + .errstr_unpriv = "invalid stack off=0 size=1", |
| 3446 | + .result = ACCEPT, |
| 3447 | + .retval = 42, |
| 3448 | + }, |
| 3208 | 3449 | { |
| 3209 | 3450 | "stack pointer arithmetic", |
| 3210 | 3451 | .insns = { |
| @@ -6610,7 +6851,446 @@ static struct bpf_test tests[] = { · 3399 unmodified lines |
| 6610 | 6851 | .prog_type = BPF_PROG_TYPE_TRACEPOINT, |
| 6611 | 6852 | }, |
| 6612 | 6853 | { |
| 6613 | | − "map access: known scalar += value_ptr", |
| 6854 | + "map access: known scalar += value_ptr from different maps", |
| 6855 | + .insns = { |
| 6856 | + BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, |
| 6857 | + offsetof(struct __sk_buff, len)), |
| 6858 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 6859 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 6860 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 6861 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 1, 3), |
| 6862 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 6863 | + BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), |
| 6864 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 6865 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 6866 | + BPF_FUNC_map_lookup_elem), |
| 6867 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), |
| 6868 | + BPF_MOV64_IMM(BPF_REG_1, 4), |
| 6869 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), |
| 6870 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), |
| 6871 | + BPF_MOV64_IMM(BPF_REG_0, 1), |
| 6872 | + BPF_EXIT_INSN(), |
| 6873 | + }, |
| 6874 | + .fixup_map_hash_16b = { 5 }, |
| 6875 | + .fixup_map_array_48b = { 8 }, |
| 6876 | + .result = ACCEPT, |
| 6877 | + .result_unpriv = REJECT, |
| 6878 | + .errstr_unpriv = "R1 tried to add from different maps", |
| 6879 | + .retval = 1, |
| 6880 | + }, |
| 6881 | + { |
| 6882 | + "map access: value_ptr -= known scalar from different maps", |
| 6883 | + .insns = { |
| 6884 | + BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, |
| 6885 | + offsetof(struct __sk_buff, len)), |
| 6886 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 6887 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 6888 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 6889 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 1, 3), |
| 6890 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 6891 | + BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), |
| 6892 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 6893 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 6894 | + BPF_FUNC_map_lookup_elem), |
| 6895 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), |
| 6896 | + BPF_MOV64_IMM(BPF_REG_1, 4), |
| 6897 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), |
| 6898 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 6899 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), |
| 6900 | + BPF_MOV64_IMM(BPF_REG_0, 1), |
| 6901 | + BPF_EXIT_INSN(), |
| 6902 | + }, |
| 6903 | + .fixup_map_hash_16b = { 5 }, |
| 6904 | + .fixup_map_array_48b = { 8 }, |
| 6905 | + .result = ACCEPT, |
| 6906 | + .result_unpriv = REJECT, |
| 6907 | + .errstr_unpriv = "R0 min value is outside of the array range", |
| 6908 | + .retval = 1, |
| 6909 | + }, |
| 6910 | + { |
| 6911 | + "map access: known scalar += value_ptr from different maps, but same value properties", |
| 6912 | + .insns = { |
| 6913 | + BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, |
| 6914 | + offsetof(struct __sk_buff, len)), |
| 6915 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 6916 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 6917 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 6918 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 1, 3), |
| 6919 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 6920 | + BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), |
| 6921 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 6922 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 6923 | + BPF_FUNC_map_lookup_elem), |
| 6924 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), |
| 6925 | + BPF_MOV64_IMM(BPF_REG_1, 4), |
| 6926 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), |
| 6927 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), |
| 6928 | + BPF_MOV64_IMM(BPF_REG_0, 1), |
| 6929 | + BPF_EXIT_INSN(), |
| 6930 | + }, |
| 6931 | + .fixup_map_hash_48b = { 5 }, |
| 6932 | + .fixup_map_array_48b = { 8 }, |
| 6933 | + .result = ACCEPT, |
| 6934 | + .retval = 1, |
| 6935 | + }, |
| 6936 | + { |
| 6937 | + "map access: value_ptr += known scalar, upper oob arith, test 1", |
| 6938 | + .insns = { |
| 6939 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 6940 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 6941 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 6942 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 6943 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 6944 | + BPF_FUNC_map_lookup_elem), |
| 6945 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), |
| 6946 | + BPF_MOV64_IMM(BPF_REG_1, 48), |
| 6947 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 6948 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), |
| 6949 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), |
| 6950 | + BPF_MOV64_IMM(BPF_REG_0, 1), |
| 6951 | + BPF_EXIT_INSN(), |
| 6952 | + }, |
| 6953 | + .fixup_map_array_48b = { 3 }, |
| 6954 | + .result = ACCEPT, |
| 6955 | + .result_unpriv = REJECT, |
| 6956 | + .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", |
| 6957 | + .retval = 1, |
| 6958 | + }, |
| 6959 | + { |
| 6960 | + "map access: value_ptr += known scalar, upper oob arith, test 2", |
| 6961 | + .insns = { |
| 6962 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 6963 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 6964 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 6965 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 6966 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 6967 | + BPF_FUNC_map_lookup_elem), |
| 6968 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), |
| 6969 | + BPF_MOV64_IMM(BPF_REG_1, 49), |
| 6970 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 6971 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), |
| 6972 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), |
| 6973 | + BPF_MOV64_IMM(BPF_REG_0, 1), |
| 6974 | + BPF_EXIT_INSN(), |
| 6975 | + }, |
| 6976 | + .fixup_map_array_48b = { 3 }, |
| 6977 | + .result = ACCEPT, |
| 6978 | + .result_unpriv = REJECT, |
| 6979 | + .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", |
| 6980 | + .retval = 1, |
| 6981 | + }, |
| 6982 | + { |
| 6983 | + "map access: value_ptr += known scalar, upper oob arith, test 3", |
| 6984 | + .insns = { |
| 6985 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 6986 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 6987 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 6988 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 6989 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 6990 | + BPF_FUNC_map_lookup_elem), |
| 6991 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), |
| 6992 | + BPF_MOV64_IMM(BPF_REG_1, 47), |
| 6993 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 6994 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), |
| 6995 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), |
| 6996 | + BPF_MOV64_IMM(BPF_REG_0, 1), |
| 6997 | + BPF_EXIT_INSN(), |
| 6998 | + }, |
| 6999 | + .fixup_map_array_48b = { 3 }, |
| 7000 | + .result = ACCEPT, |
| 7001 | + .result_unpriv = REJECT, |
| 7002 | + .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", |
| 7003 | + .retval = 1, |
| 7004 | + }, |
| 7005 | + { |
| 7006 | + "map access: value_ptr -= known scalar, lower oob arith, test 1", |
| 7007 | + .insns = { |
| 7008 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 7009 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 7010 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 7011 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 7012 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 7013 | + BPF_FUNC_map_lookup_elem), |
| 7014 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), |
| 7015 | + BPF_MOV64_IMM(BPF_REG_1, 47), |
| 7016 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7017 | + BPF_MOV64_IMM(BPF_REG_1, 48), |
| 7018 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), |
| 7019 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), |
| 7020 | + BPF_MOV64_IMM(BPF_REG_0, 1), |
| 7021 | + BPF_EXIT_INSN(), |
| 7022 | + }, |
| 7023 | + .fixup_map_array_48b = { 3 }, |
| 7024 | + .result = REJECT, |
| 7025 | + .errstr = "R0 min value is outside of the array range", |
| 7026 | + .result_unpriv = REJECT, |
| 7027 | + .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", |
| 7028 | + }, |
| 7029 | + { |
| 7030 | + "map access: value_ptr -= known scalar, lower oob arith, test 2", |
| 7031 | + .insns = { |
| 7032 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 7033 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 7034 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 7035 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 7036 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 7037 | + BPF_FUNC_map_lookup_elem), |
| 7038 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), |
| 7039 | + BPF_MOV64_IMM(BPF_REG_1, 47), |
| 7040 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7041 | + BPF_MOV64_IMM(BPF_REG_1, 48), |
| 7042 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), |
| 7043 | + BPF_MOV64_IMM(BPF_REG_1, 1), |
| 7044 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7045 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), |
| 7046 | + BPF_MOV64_IMM(BPF_REG_0, 1), |
| 7047 | + BPF_EXIT_INSN(), |
| 7048 | + }, |
| 7049 | + .fixup_map_array_48b = { 3 }, |
| 7050 | + .result = ACCEPT, |
| 7051 | + .result_unpriv = REJECT, |
| 7052 | + .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", |
| 7053 | + .retval = 1, |
| 7054 | + }, |
| 7055 | + { |
| 7056 | + "map access: value_ptr -= known scalar, lower oob arith, test 3", |
| 7057 | + .insns = { |
| 7058 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 7059 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 7060 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 7061 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 7062 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 7063 | + BPF_FUNC_map_lookup_elem), |
| 7064 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), |
| 7065 | + BPF_MOV64_IMM(BPF_REG_1, 47), |
| 7066 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7067 | + BPF_MOV64_IMM(BPF_REG_1, 47), |
| 7068 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_0, BPF_REG_1), |
| 7069 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), |
| 7070 | + BPF_MOV64_IMM(BPF_REG_0, 1), |
| 7071 | + BPF_EXIT_INSN(), |
| 7072 | + }, |
| 7073 | + .fixup_map_array_48b = { 3 }, |
| 7074 | + .result = ACCEPT, |
| 7075 | + .result_unpriv = REJECT, |
| 7076 | + .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", |
| 7077 | + .retval = 1, |
| 7078 | + }, |
| 7079 | + { |
| 7080 | + "map access: known scalar += value_ptr", |
| 7081 | + .insns = { |
| 7082 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 7083 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 7084 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 7085 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 7086 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 7087 | + BPF_FUNC_map_lookup_elem), |
| 7088 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), |
| 7089 | + BPF_MOV64_IMM(BPF_REG_1, 4), |
| 7090 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), |
| 7091 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), |
| 7092 | + BPF_MOV64_IMM(BPF_REG_0, 1), |
| 7093 | + BPF_EXIT_INSN(), |
| 7094 | + }, |
| 7095 | + .fixup_map_array_48b = { 3 }, |
| 7096 | + .result = ACCEPT, |
| 7097 | + .retval = 1, |
| 7098 | + }, |
| 7099 | + { |
| 7100 | + "map access: value_ptr += known scalar, 1", |
| 7101 | + .insns = { |
| 7102 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 7103 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 7104 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 7105 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 7106 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 7107 | + BPF_FUNC_map_lookup_elem), |
| 7108 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), |
| 7109 | + BPF_MOV64_IMM(BPF_REG_1, 4), |
| 7110 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7111 | + BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), |
| 7112 | + BPF_MOV64_IMM(BPF_REG_0, 1), |
| 7113 | + BPF_EXIT_INSN(), |
| 7114 | + }, |
| 7115 | + .fixup_map_array_48b = { 3 }, |
| 7116 | + .result = ACCEPT, |
| 7117 | + .retval = 1, |
| 7118 | + }, |
| 7119 | + { |
| 7120 | + "map access: value_ptr += known scalar, 2", |
| 7121 | + .insns = { |
| 7122 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 7123 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 7124 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 7125 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 7126 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 7127 | + BPF_FUNC_map_lookup_elem), |
| 7128 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), |
| 7129 | + BPF_MOV64_IMM(BPF_REG_1, 49), |
| 7130 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7131 | + BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), |
| 7132 | + BPF_MOV64_IMM(BPF_REG_0, 1), |
| 7133 | + BPF_EXIT_INSN(), |
| 7134 | + }, |
| 7135 | + .fixup_map_array_48b = { 3 }, |
| 7136 | + .result = REJECT, |
| 7137 | + .errstr = "invalid access to map value", |
| 7138 | + }, |
| 7139 | + { |
| 7140 | + "map access: value_ptr += known scalar, 3", |
| 7141 | + .insns = { |
| 7142 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 7143 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 7144 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 7145 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 7146 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 7147 | + BPF_FUNC_map_lookup_elem), |
| 7148 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), |
| 7149 | + BPF_MOV64_IMM(BPF_REG_1, -1), |
| 7150 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7151 | + BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), |
| 7152 | + BPF_MOV64_IMM(BPF_REG_0, 1), |
| 7153 | + BPF_EXIT_INSN(), |
| 7154 | + }, |
| 7155 | + .fixup_map_array_48b = { 3 }, |
| 7156 | + .result = REJECT, |
| 7157 | + .errstr = "invalid access to map value", |
| 7158 | + }, |
| 7159 | + { |
| 7160 | + "map access: value_ptr += known scalar, 4", |
| 7161 | + .insns = { |
| 7162 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 7163 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 7164 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 7165 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 7166 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 7167 | + BPF_FUNC_map_lookup_elem), |
| 7168 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 7), |
| 7169 | + BPF_MOV64_IMM(BPF_REG_1, 5), |
| 7170 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7171 | + BPF_MOV64_IMM(BPF_REG_1, -2), |
| 7172 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7173 | + BPF_MOV64_IMM(BPF_REG_1, -1), |
| 7174 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7175 | + BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), |
| 7176 | + BPF_MOV64_IMM(BPF_REG_0, 1), |
| 7177 | + BPF_EXIT_INSN(), |
| 7178 | + }, |
| 7179 | + .fixup_map_array_48b = { 3 }, |
| 7180 | + .result = ACCEPT, |
| 7181 | + .result_unpriv = REJECT, |
| 7182 | + .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", |
| 7183 | + .retval = 1, |
| 7184 | + }, |
| 7185 | + { |
| 7186 | + "map access: value_ptr += known scalar, 5", |
| 7187 | + .insns = { |
| 7188 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 7189 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 7190 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 7191 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 7192 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 7193 | + BPF_FUNC_map_lookup_elem), |
| 7194 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), |
| 7195 | + BPF_MOV64_IMM(BPF_REG_1, (6 + 1) * sizeof(int)), |
| 7196 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), |
| 7197 | + BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), |
| 7198 | + BPF_EXIT_INSN(), |
| 7199 | + }, |
| 7200 | + .fixup_map_array_48b = { 3 }, |
| 7201 | + .result = ACCEPT, |
| 7202 | + .retval = 0xabcdef12, |
| 7203 | + }, |
| 7204 | + { |
| 7205 | + "map access: value_ptr += known scalar, 6", |
| 7206 | + .insns = { |
| 7207 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 7208 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 7209 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 7210 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 7211 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 7212 | + BPF_FUNC_map_lookup_elem), |
| 7213 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 5), |
| 7214 | + BPF_MOV64_IMM(BPF_REG_1, (3 + 1) * sizeof(int)), |
| 7215 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7216 | + BPF_MOV64_IMM(BPF_REG_1, 3 * sizeof(int)), |
| 7217 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7218 | + BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 0), |
| 7219 | + BPF_EXIT_INSN(), |
| 7220 | + }, |
| 7221 | + .fixup_map_array_48b = { 3 }, |
| 7222 | + .result = ACCEPT, |
| 7223 | + .retval = 0xabcdef12, |
| 7224 | + }, |
| 7225 | + { |
| 7226 | + "map access: unknown scalar += value_ptr, 1", |
| 7227 | + .insns = { |
| 7228 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 7229 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 7230 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 7231 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 7232 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 7233 | + BPF_FUNC_map_lookup_elem), |
| 7234 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), |
| 7235 | + BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), |
| 7236 | + BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), |
| 7237 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), |
| 7238 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), |
| 7239 | + BPF_MOV64_IMM(BPF_REG_0, 1), |
| 7240 | + BPF_EXIT_INSN(), |
| 7241 | + }, |
| 7242 | + .fixup_map_array_48b = { 3 }, |
| 7243 | + .result = ACCEPT, |
| 7244 | + .retval = 1, |
| 7245 | + }, |
| 7246 | + { |
| 7247 | + "map access: unknown scalar += value_ptr, 2", |
| 7248 | + .insns = { |
| 7249 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 7250 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 7251 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 7252 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 7253 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 7254 | + BPF_FUNC_map_lookup_elem), |
| 7255 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), |
| 7256 | + BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), |
| 7257 | + BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31), |
| 7258 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), |
| 7259 | + BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), |
| 7260 | + BPF_EXIT_INSN(), |
| 7261 | + }, |
| 7262 | + .fixup_map_array_48b = { 3 }, |
| 7263 | + .result = ACCEPT, |
| 7264 | + .retval = 0xabcdef12, |
| 7265 | + }, |
| 7266 | + { |
| 7267 | + "map access: unknown scalar += value_ptr, 3", |
| 7268 | + .insns = { |
| 7269 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 7270 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 7271 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 7272 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 7273 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 7274 | + BPF_FUNC_map_lookup_elem), |
| 7275 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 8), |
| 7276 | + BPF_MOV64_IMM(BPF_REG_1, -1), |
| 7277 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7278 | + BPF_MOV64_IMM(BPF_REG_1, 1), |
| 7279 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7280 | + BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), |
| 7281 | + BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31), |
| 7282 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), |
| 7283 | + BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), |
| 7284 | + BPF_EXIT_INSN(), |
| 7285 | + }, |
| 7286 | + .fixup_map_array_48b = { 3 }, |
| 7287 | + .result = ACCEPT, |
| 7288 | + .result_unpriv = REJECT, |
| 7289 | + .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", |
| 7290 | + .retval = 0xabcdef12, |
| 7291 | + }, |
| 7292 | + { |
| 7293 | + "map access: unknown scalar += value_ptr, 4", |
| 6614 | 7294 | .insns = { |
| 6615 | 7295 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 6616 | 7296 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| @@ -6618,19 +7298,22 @@ static struct bpf_test tests[] = { · 1 unmodified line |
| 6618 | 7298 | BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 6619 | 7299 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 6620 | 7300 | BPF_FUNC_map_lookup_elem), |
| 6621 | | − BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), |
| 6622 | | − BPF_MOV64_IMM(BPF_REG_1, 4), |
| 7301 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), |
| 7302 | + BPF_MOV64_IMM(BPF_REG_1, 19), |
| 7303 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7304 | + BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), |
| 7305 | + BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31), |
| 6623 | 7306 | BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), |
| 6624 | | − BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), |
| 6625 | | − BPF_MOV64_IMM(BPF_REG_0, 1), |
| 7307 | + BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), |
| 6626 | 7308 | BPF_EXIT_INSN(), |
| 6627 | 7309 | }, |
| 6628 | 7310 | .fixup_map_array_48b = { 3 }, |
| 6629 | | − .result = ACCEPT, |
| 6630 | | − .retval = 1, |
| 7311 | + .result = REJECT, |
| 7312 | + .errstr = "R1 max value is outside of the array range", |
| 7313 | + .errstr_unpriv = "R1 pointer arithmetic of map value goes out of range", |
| 6631 | 7314 | }, |
| 6632 | 7315 | { |
| 6633 | | − "map access: value_ptr += known scalar", |
| 7316 | + "map access: value_ptr += unknown scalar, 1", |
| 6634 | 7317 | .insns = { |
| 6635 | 7318 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 6636 | 7319 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| @@ -6638,8 +7321,9 @@ static struct bpf_test tests[] = { · 1 unmodified line |
| 6638 | 7321 | BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 6639 | 7322 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 6640 | 7323 | BPF_FUNC_map_lookup_elem), |
| 6641 | | − BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), |
| 6642 | | − BPF_MOV64_IMM(BPF_REG_1, 4), |
| 7324 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), |
| 7325 | + BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), |
| 7326 | + BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), |
| 6643 | 7327 | BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 6644 | 7328 | BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), |
| 6645 | 7329 | BPF_MOV64_IMM(BPF_REG_0, 1), |
| @@ -6650,7 +7334,7 @@ static struct bpf_test tests[] = { · 4 unmodified lines |
| 6650 | 7334 | .retval = 1, |
| 6651 | 7335 | }, |
| 6652 | 7336 | { |
| 6653 | | − "map access: unknown scalar += value_ptr", |
| 7337 | + "map access: value_ptr += unknown scalar, 2", |
| 6654 | 7338 | .insns = { |
| 6655 | 7339 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 6656 | 7340 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| @@ -6659,19 +7343,18 @@ static struct bpf_test tests[] = { · 2 unmodified lines |
| 6659 | 7343 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 6660 | 7344 | BPF_FUNC_map_lookup_elem), |
| 6661 | 7345 | BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), |
| 6662 | | − BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), |
| 6663 | | − BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), |
| 6664 | | − BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), |
| 6665 | | − BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_1, 0), |
| 6666 | | − BPF_MOV64_IMM(BPF_REG_0, 1), |
| 7346 | + BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, 0), |
| 7347 | + BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 31), |
| 7348 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 7349 | + BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 0), |
| 6667 | 7350 | BPF_EXIT_INSN(), |
| 6668 | 7351 | }, |
| 6669 | 7352 | .fixup_map_array_48b = { 3 }, |
| 6670 | 7353 | .result = ACCEPT, |
| 6671 | | − .retval = 1, |
| 7354 | + .retval = 0xabcdef12, |
| 6672 | 7355 | }, |
| 6673 | 7356 | { |
| 6674 | | − "map access: value_ptr += unknown scalar", |
| 7357 | + "map access: value_ptr += unknown scalar, 3", |
| 6675 | 7358 | .insns = { |
| 6676 | 7359 | BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 6677 | 7360 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| @@ -6679,13 +7362,20 @@ static struct bpf_test tests[] = { · 1 unmodified line |
| 6679 | 7362 | BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 6680 | 7363 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 6681 | 7364 | BPF_FUNC_map_lookup_elem), |
| 6682 | | − BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 4), |
| 6683 | | − BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), |
| 7365 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 11), |
| 7366 | + BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0), |
| 7367 | + BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 8), |
| 7368 | + BPF_LDX_MEM(BPF_DW, BPF_REG_3, BPF_REG_0, 16), |
| 6684 | 7369 | BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xf), |
| 6685 | | − BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 6686 | | − BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_0, 0), |
| 7370 | + BPF_ALU64_IMM(BPF_AND, BPF_REG_3, 1), |
| 7371 | + BPF_ALU64_IMM(BPF_OR, BPF_REG_3, 1), |
| 7372 | + BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_3, 4), |
| 7373 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_3), |
| 7374 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), |
| 6687 | 7375 | BPF_MOV64_IMM(BPF_REG_0, 1), |
| 6688 | 7376 | BPF_EXIT_INSN(), |
| 7377 | + BPF_MOV64_IMM(BPF_REG_0, 2), |
| 7378 | + BPF_JMP_IMM(BPF_JA, 0, 0, -3), |
| 6689 | 7379 | }, |
| 6690 | 7380 | .fixup_map_array_48b = { 3 }, |
| 6691 | 7381 | .result = ACCEPT, |
| @@ -6770,6 +7460,8 @@ static struct bpf_test tests[] = { · 78 unmodified lines |
| 6770 | 7460 | }, |
| 6771 | 7461 | .fixup_map_array_48b = { 3 }, |
| 6772 | 7462 | .result = ACCEPT, |
| 7463 | + .result_unpriv = REJECT, |
| 7464 | + .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", |
| 6773 | 7465 | .retval = 1, |
| 6774 | 7466 | }, |
| 6775 | 7467 | { |
| @@ -6837,6 +7529,8 @@ static struct bpf_test tests[] = { · 61 unmodified lines |
| 6837 | 7529 | }, |
| 6838 | 7530 | .fixup_map_array_48b = { 3 }, |
| 6839 | 7531 | .result = ACCEPT, |
| 7532 | + .result_unpriv = REJECT, |
| 7533 | + .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", |
| 6840 | 7534 | .retval = 1, |
| 6841 | 7535 | }, |
| 6842 | 7536 | { |
| @@ -8376,6 +9070,7 @@ static struct bpf_test tests[] = { · 1533 unmodified lines |
| 8376 | 9070 | }, |
| 8377 | 9071 | .fixup_map_hash_8b = { 3 }, |
| 8378 | 9072 | .errstr = "unbounded min value", |
| 9073 | + .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", |
| 8379 | 9074 | .result = REJECT, |
| 8380 | 9075 | }, |
| 8381 | 9076 | { |
| @@ -8400,6 +9095,7 @@ static struct bpf_test tests[] = { · 18 unmodified lines |
| 8400 | 9095 | }, |
| 8401 | 9096 | .fixup_map_hash_8b = { 3 }, |
| 8402 | 9097 | .errstr = "unbounded min value", |
| 9098 | + .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", |
| 8403 | 9099 | .result = REJECT, |
| 8404 | 9100 | }, |
| 8405 | 9101 | { |
| @@ -8426,6 +9122,7 @@ static struct bpf_test tests[] = { · 20 unmodified lines |
| 8426 | 9122 | }, |
| 8427 | 9123 | .fixup_map_hash_8b = { 3 }, |
| 8428 | 9124 | .errstr = "unbounded min value", |
| 9125 | + .errstr_unpriv = "R8 has unknown scalar with mixed signed bounds", |
| 8429 | 9126 | .result = REJECT, |
| 8430 | 9127 | }, |
| 8431 | 9128 | { |
| @@ -8451,6 +9148,7 @@ static struct bpf_test tests[] = { · 19 unmodified lines |
| 8451 | 9148 | }, |
| 8452 | 9149 | .fixup_map_hash_8b = { 3 }, |
| 8453 | 9150 | .errstr = "unbounded min value", |
| 9151 | + .errstr_unpriv = "R8 has unknown scalar with mixed signed bounds", |
| 8454 | 9152 | .result = REJECT, |
| 8455 | 9153 | }, |
| 8456 | 9154 | { |
| @@ -8499,6 +9197,7 @@ static struct bpf_test tests[] = { · 42 unmodified lines |
| 8499 | 9197 | }, |
| 8500 | 9198 | .fixup_map_hash_8b = { 3 }, |
| 8501 | 9199 | .errstr = "unbounded min value", |
| 9200 | + .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", |
| 8502 | 9201 | .result = REJECT, |
| 8503 | 9202 | }, |
| 8504 | 9203 | { |
| @@ -8570,6 +9269,7 @@ static struct bpf_test tests[] = { · 65 unmodified lines |
| 8570 | 9269 | }, |
| 8571 | 9270 | .fixup_map_hash_8b = { 3 }, |
| 8572 | 9271 | .errstr = "unbounded min value", |
| 9272 | + .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", |
| 8573 | 9273 | .result = REJECT, |
| 8574 | 9274 | }, |
| 8575 | 9275 | { |
| @@ -8621,6 +9321,7 @@ static struct bpf_test tests[] = { · 45 unmodified lines |
| 8621 | 9321 | }, |
| 8622 | 9322 | .fixup_map_hash_8b = { 3 }, |
| 8623 | 9323 | .errstr = "unbounded min value", |
| 9324 | + .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", |
| 8624 | 9325 | .result = REJECT, |
| 8625 | 9326 | }, |
| 8626 | 9327 | { |
| @@ -8648,6 +9349,7 @@ static struct bpf_test tests[] = { · 21 unmodified lines |
| 8648 | 9349 | }, |
| 8649 | 9350 | .fixup_map_hash_8b = { 3 }, |
| 8650 | 9351 | .errstr = "unbounded min value", |
| 9352 | + .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", |
| 8651 | 9353 | .result = REJECT, |
| 8652 | 9354 | }, |
| 8653 | 9355 | { |
| @@ -8674,6 +9376,7 @@ static struct bpf_test tests[] = { · 20 unmodified lines |
| 8674 | 9376 | }, |
| 8675 | 9377 | .fixup_map_hash_8b = { 3 }, |
| 8676 | 9378 | .errstr = "unbounded min value", |
| 9379 | + .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", |
| 8677 | 9380 | .result = REJECT, |
| 8678 | 9381 | }, |
| 8679 | 9382 | { |
| @@ -8703,6 +9406,7 @@ static struct bpf_test tests[] = { · 23 unmodified lines |
| 8703 | 9406 | }, |
| 8704 | 9407 | .fixup_map_hash_8b = { 3 }, |
| 8705 | 9408 | .errstr = "unbounded min value", |
| 9409 | + .errstr_unpriv = "R7 has unknown scalar with mixed signed bounds", |
| 8706 | 9410 | .result = REJECT, |
| 8707 | 9411 | }, |
| 8708 | 9412 | { |
| @@ -8733,6 +9437,7 @@ static struct bpf_test tests[] = { · 24 unmodified lines |
| 8733 | 9437 | }, |
| 8734 | 9438 | .fixup_map_hash_8b = { 4 }, |
| 8735 | 9439 | .errstr = "unbounded min value", |
| 9440 | + .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", |
| 8736 | 9441 | .result = REJECT, |
| 8737 | 9442 | }, |
| 8738 | 9443 | { |
| @@ -8761,6 +9466,7 @@ static struct bpf_test tests[] = { · 22 unmodified lines |
| 8761 | 9466 | }, |
| 8762 | 9467 | .fixup_map_hash_8b = { 3 }, |
| 8763 | 9468 | .errstr = "unbounded min value", |
| 9469 | + .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", |
| 8764 | 9470 | .result = REJECT, |
| 8765 | 9471 | .result_unpriv = REJECT, |
| 8766 | 9472 | }, |
| @@ -8813,8 +9519,38 @@ static struct bpf_test tests[] = { · 46 unmodified lines |
| 8813 | 9519 | }, |
| 8814 | 9520 | .fixup_map_hash_8b = { 3 }, |
| 8815 | 9521 | .errstr = "R0 min value is negative, either use unsigned index or do a if (index >=0) check.", |
| 9522 | + .errstr_unpriv = "R1 has unknown scalar with mixed signed bounds", |
| 8816 | 9523 | .result = REJECT, |
| 8817 | 9524 | }, |
| 9525 | + { |
| 9526 | + "check subtraction on pointers for unpriv", |
| 9527 | + .insns = { |
| 9528 | + BPF_MOV64_IMM(BPF_REG_0, 0), |
| 9529 | + BPF_LD_MAP_FD(BPF_REG_ARG1, 0), |
| 9530 | + BPF_MOV64_REG(BPF_REG_ARG2, BPF_REG_FP), |
| 9531 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_ARG2, -8), |
| 9532 | + BPF_ST_MEM(BPF_DW, BPF_REG_ARG2, 0, 9), |
| 9533 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 9534 | + BPF_FUNC_map_lookup_elem), |
| 9535 | + BPF_MOV64_REG(BPF_REG_9, BPF_REG_FP), |
| 9536 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_9, BPF_REG_0), |
| 9537 | + BPF_LD_MAP_FD(BPF_REG_ARG1, 0), |
| 9538 | + BPF_MOV64_REG(BPF_REG_ARG2, BPF_REG_FP), |
| 9539 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_ARG2, -8), |
| 9540 | + BPF_ST_MEM(BPF_DW, BPF_REG_ARG2, 0, 0), |
| 9541 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 9542 | + BPF_FUNC_map_lookup_elem), |
| 9543 | + BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), |
| 9544 | + BPF_EXIT_INSN(), |
| 9545 | + BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_9, 0), |
| 9546 | + BPF_MOV64_IMM(BPF_REG_0, 0), |
| 9547 | + BPF_EXIT_INSN(), |
| 9548 | + }, |
| 9549 | + .fixup_map_hash_8b = { 1, 9 }, |
| 9550 | + .result = ACCEPT, |
| 9551 | + .result_unpriv = REJECT, |
| 9552 | + .errstr_unpriv = "R9 pointer -= pointer prohibited", |
| 9553 | + }, |
| 8818 | 9554 | { |
| 8819 | 9555 | "bounds check based on zero-extended MOV", |
| 8820 | 9556 | .insns = { |
| @@ -9145,6 +9881,36 @@ static struct bpf_test tests[] = { · 324 unmodified lines |
| 9145 | 9881 | .errstr = "R0 unbounded memory access", |
| 9146 | 9882 | .result = REJECT |
| 9147 | 9883 | }, |
| 9884 | + { |
| 9885 | + "bounds check after 32-bit right shift with 64-bit input", |
| 9886 | + .insns = { |
| 9887 | + BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), |
| 9888 | + BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), |
| 9889 | + BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), |
| 9890 | + BPF_LD_MAP_FD(BPF_REG_1, 0), |
| 9891 | + BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, |
| 9892 | + BPF_FUNC_map_lookup_elem), |
| 9893 | + BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 6), |
| 9894 | + /* r1 = 2 */ |
| 9895 | + BPF_MOV64_IMM(BPF_REG_1, 2), |
| 9896 | + /* r1 = 1<<32 */ |
| 9897 | + BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 31), |
| 9898 | + /* r1 = 0 (NOT 2!) */ |
| 9899 | + BPF_ALU32_IMM(BPF_RSH, BPF_REG_1, 31), |
| 9900 | + /* r1 = 0xffff'fffe (NOT 0!) */ |
| 9901 | + BPF_ALU32_IMM(BPF_SUB, BPF_REG_1, 2), |
| 9902 | + /* computes OOB pointer */ |
| 9903 | + BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_1), |
| 9904 | + /* OOB access */ |
| 9905 | + BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), |
| 9906 | + /* exit */ |
| 9907 | + BPF_MOV64_IMM(BPF_REG_0, 0), |
| 9908 | + BPF_EXIT_INSN(), |
| 9909 | + }, |
| 9910 | + .fixup_map_hash_8b = { 3 }, |
| 9911 | + .errstr = "R0 invalid mem access", |
| 9912 | + .result = REJECT, |
| 9913 | + }, |
| 9148 | 9914 | { |
| 9149 | 9915 | "bounds check map access with off+size signed 32bit overflow. test1", |
| 9150 | 9916 | .insns = { |
| @@ -9185,6 +9951,7 @@ static struct bpf_test tests[] = { · 34 unmodified lines |
| 9185 | 9951 | }, |
| 9186 | 9952 | .fixup_map_hash_8b = { 3 }, |
| 9187 | 9953 | .errstr = "pointer offset 1073741822", |
| 9954 | + .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", |
| 9188 | 9955 | .result = REJECT |
| 9189 | 9956 | }, |
| 9190 | 9957 | { |
| @@ -9206,6 +9973,7 @@ static struct bpf_test tests[] = { · 15 unmodified lines |
| 9206 | 9973 | }, |
| 9207 | 9974 | .fixup_map_hash_8b = { 3 }, |
| 9208 | 9975 | .errstr = "pointer offset -1073741822", |
| 9976 | + .errstr_unpriv = "R0 pointer arithmetic of map value goes out of range", |
| 9209 | 9977 | .result = REJECT |
| 9210 | 9978 | }, |
| 9211 | 9979 | { |
| @@ -9377,6 +10145,7 @@ static struct bpf_test tests[] = { · 165 unmodified lines |
| 9377 | 10145 | BPF_EXIT_INSN() |
| 9378 | 10146 | }, |
| 9379 | 10147 | .errstr = "fp pointer offset 1073741822", |
| 10148 | + .errstr_unpriv = "R1 stack pointer arithmetic goes out of range", |
| 9380 | 10149 | .result = REJECT |
| 9381 | 10150 | }, |
| 9382 | 10151 | { |
| @@ -13718,6 +14487,328 @@ static struct bpf_test tests[] = { · 4335 unmodified lines |
| 13718 | 14487 | .result_unpriv = ACCEPT, |
| 13719 | 14488 | .insn_processed = 15, |
| 13720 | 14489 | }, |
| 14490 | + { |
| 14491 | + "masking, test out of bounds 1", |
| 14492 | + .insns = { |
| 14493 | + BPF_MOV32_IMM(BPF_REG_1, 5), |
| 14494 | + BPF_MOV32_IMM(BPF_REG_2, 5 - 1), |
| 14495 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14496 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14497 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14498 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14499 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14500 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14501 | + BPF_EXIT_INSN(), |
| 14502 | + }, |
| 14503 | + .result = ACCEPT, |
| 14504 | + .retval = 0, |
| 14505 | + }, |
| 14506 | + { |
| 14507 | + "masking, test out of bounds 2", |
| 14508 | + .insns = { |
| 14509 | + BPF_MOV32_IMM(BPF_REG_1, 1), |
| 14510 | + BPF_MOV32_IMM(BPF_REG_2, 1 - 1), |
| 14511 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14512 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14513 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14514 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14515 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14516 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14517 | + BPF_EXIT_INSN(), |
| 14518 | + }, |
| 14519 | + .result = ACCEPT, |
| 14520 | + .retval = 0, |
| 14521 | + }, |
| 14522 | + { |
| 14523 | + "masking, test out of bounds 3", |
| 14524 | + .insns = { |
| 14525 | + BPF_MOV32_IMM(BPF_REG_1, 0xffffffff), |
| 14526 | + BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), |
| 14527 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14528 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14529 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14530 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14531 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14532 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14533 | + BPF_EXIT_INSN(), |
| 14534 | + }, |
| 14535 | + .result = ACCEPT, |
| 14536 | + .retval = 0, |
| 14537 | + }, |
| 14538 | + { |
| 14539 | + "masking, test out of bounds 4", |
| 14540 | + .insns = { |
| 14541 | + BPF_MOV32_IMM(BPF_REG_1, 0xffffffff), |
| 14542 | + BPF_MOV32_IMM(BPF_REG_2, 1 - 1), |
| 14543 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14544 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14545 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14546 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14547 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14548 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14549 | + BPF_EXIT_INSN(), |
| 14550 | + }, |
| 14551 | + .result = ACCEPT, |
| 14552 | + .retval = 0, |
| 14553 | + }, |
| 14554 | + { |
| 14555 | + "masking, test out of bounds 5", |
| 14556 | + .insns = { |
| 14557 | + BPF_MOV32_IMM(BPF_REG_1, -1), |
| 14558 | + BPF_MOV32_IMM(BPF_REG_2, 1 - 1), |
| 14559 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14560 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14561 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14562 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14563 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14564 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14565 | + BPF_EXIT_INSN(), |
| 14566 | + }, |
| 14567 | + .result = ACCEPT, |
| 14568 | + .retval = 0, |
| 14569 | + }, |
| 14570 | + { |
| 14571 | + "masking, test out of bounds 6", |
| 14572 | + .insns = { |
| 14573 | + BPF_MOV32_IMM(BPF_REG_1, -1), |
| 14574 | + BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), |
| 14575 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14576 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14577 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14578 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14579 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14580 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14581 | + BPF_EXIT_INSN(), |
| 14582 | + }, |
| 14583 | + .result = ACCEPT, |
| 14584 | + .retval = 0, |
| 14585 | + }, |
| 14586 | + { |
| 14587 | + "masking, test out of bounds 7", |
| 14588 | + .insns = { |
| 14589 | + BPF_MOV64_IMM(BPF_REG_1, 5), |
| 14590 | + BPF_MOV32_IMM(BPF_REG_2, 5 - 1), |
| 14591 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14592 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14593 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14594 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14595 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14596 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14597 | + BPF_EXIT_INSN(), |
| 14598 | + }, |
| 14599 | + .result = ACCEPT, |
| 14600 | + .retval = 0, |
| 14601 | + }, |
| 14602 | + { |
| 14603 | + "masking, test out of bounds 8", |
| 14604 | + .insns = { |
| 14605 | + BPF_MOV64_IMM(BPF_REG_1, 1), |
| 14606 | + BPF_MOV32_IMM(BPF_REG_2, 1 - 1), |
| 14607 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14608 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14609 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14610 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14611 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14612 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14613 | + BPF_EXIT_INSN(), |
| 14614 | + }, |
| 14615 | + .result = ACCEPT, |
| 14616 | + .retval = 0, |
| 14617 | + }, |
| 14618 | + { |
| 14619 | + "masking, test out of bounds 9", |
| 14620 | + .insns = { |
| 14621 | + BPF_MOV64_IMM(BPF_REG_1, 0xffffffff), |
| 14622 | + BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), |
| 14623 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14624 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14625 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14626 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14627 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14628 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14629 | + BPF_EXIT_INSN(), |
| 14630 | + }, |
| 14631 | + .result = ACCEPT, |
| 14632 | + .retval = 0, |
| 14633 | + }, |
| 14634 | + { |
| 14635 | + "masking, test out of bounds 10", |
| 14636 | + .insns = { |
| 14637 | + BPF_MOV64_IMM(BPF_REG_1, 0xffffffff), |
| 14638 | + BPF_MOV32_IMM(BPF_REG_2, 1 - 1), |
| 14639 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14640 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14641 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14642 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14643 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14644 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14645 | + BPF_EXIT_INSN(), |
| 14646 | + }, |
| 14647 | + .result = ACCEPT, |
| 14648 | + .retval = 0, |
| 14649 | + }, |
| 14650 | + { |
| 14651 | + "masking, test out of bounds 11", |
| 14652 | + .insns = { |
| 14653 | + BPF_MOV64_IMM(BPF_REG_1, -1), |
| 14654 | + BPF_MOV32_IMM(BPF_REG_2, 1 - 1), |
| 14655 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14656 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14657 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14658 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14659 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14660 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14661 | + BPF_EXIT_INSN(), |
| 14662 | + }, |
| 14663 | + .result = ACCEPT, |
| 14664 | + .retval = 0, |
| 14665 | + }, |
| 14666 | + { |
| 14667 | + "masking, test out of bounds 12", |
| 14668 | + .insns = { |
| 14669 | + BPF_MOV64_IMM(BPF_REG_1, -1), |
| 14670 | + BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), |
| 14671 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14672 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14673 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14674 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14675 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14676 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14677 | + BPF_EXIT_INSN(), |
| 14678 | + }, |
| 14679 | + .result = ACCEPT, |
| 14680 | + .retval = 0, |
| 14681 | + }, |
| 14682 | + { |
| 14683 | + "masking, test in bounds 1", |
| 14684 | + .insns = { |
| 14685 | + BPF_MOV32_IMM(BPF_REG_1, 4), |
| 14686 | + BPF_MOV32_IMM(BPF_REG_2, 5 - 1), |
| 14687 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14688 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14689 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14690 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14691 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14692 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14693 | + BPF_EXIT_INSN(), |
| 14694 | + }, |
| 14695 | + .result = ACCEPT, |
| 14696 | + .retval = 4, |
| 14697 | + }, |
| 14698 | + { |
| 14699 | + "masking, test in bounds 2", |
| 14700 | + .insns = { |
| 14701 | + BPF_MOV32_IMM(BPF_REG_1, 0), |
| 14702 | + BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), |
| 14703 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14704 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14705 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14706 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14707 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14708 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14709 | + BPF_EXIT_INSN(), |
| 14710 | + }, |
| 14711 | + .result = ACCEPT, |
| 14712 | + .retval = 0, |
| 14713 | + }, |
| 14714 | + { |
| 14715 | + "masking, test in bounds 3", |
| 14716 | + .insns = { |
| 14717 | + BPF_MOV32_IMM(BPF_REG_1, 0xfffffffe), |
| 14718 | + BPF_MOV32_IMM(BPF_REG_2, 0xffffffff - 1), |
| 14719 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14720 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14721 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14722 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14723 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14724 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14725 | + BPF_EXIT_INSN(), |
| 14726 | + }, |
| 14727 | + .result = ACCEPT, |
| 14728 | + .retval = 0xfffffffe, |
| 14729 | + }, |
| 14730 | + { |
| 14731 | + "masking, test in bounds 4", |
| 14732 | + .insns = { |
| 14733 | + BPF_MOV32_IMM(BPF_REG_1, 0xabcde), |
| 14734 | + BPF_MOV32_IMM(BPF_REG_2, 0xabcdef - 1), |
| 14735 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14736 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14737 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14738 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14739 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14740 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14741 | + BPF_EXIT_INSN(), |
| 14742 | + }, |
| 14743 | + .result = ACCEPT, |
| 14744 | + .retval = 0xabcde, |
| 14745 | + }, |
| 14746 | + { |
| 14747 | + "masking, test in bounds 5", |
| 14748 | + .insns = { |
| 14749 | + BPF_MOV32_IMM(BPF_REG_1, 0), |
| 14750 | + BPF_MOV32_IMM(BPF_REG_2, 1 - 1), |
| 14751 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14752 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14753 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14754 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14755 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14756 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14757 | + BPF_EXIT_INSN(), |
| 14758 | + }, |
| 14759 | + .result = ACCEPT, |
| 14760 | + .retval = 0, |
| 14761 | + }, |
| 14762 | + { |
| 14763 | + "masking, test in bounds 6", |
| 14764 | + .insns = { |
| 14765 | + BPF_MOV32_IMM(BPF_REG_1, 46), |
| 14766 | + BPF_MOV32_IMM(BPF_REG_2, 47 - 1), |
| 14767 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_1), |
| 14768 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_1), |
| 14769 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14770 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14771 | + BPF_ALU64_REG(BPF_AND, BPF_REG_1, BPF_REG_2), |
| 14772 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), |
| 14773 | + BPF_EXIT_INSN(), |
| 14774 | + }, |
| 14775 | + .result = ACCEPT, |
| 14776 | + .retval = 46, |
| 14777 | + }, |
| 14778 | + { |
| 14779 | + "masking, test in bounds 7", |
| 14780 | + .insns = { |
| 14781 | + BPF_MOV64_IMM(BPF_REG_3, -46), |
| 14782 | + BPF_ALU64_IMM(BPF_MUL, BPF_REG_3, -1), |
| 14783 | + BPF_MOV32_IMM(BPF_REG_2, 47 - 1), |
| 14784 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_3), |
| 14785 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_3), |
| 14786 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14787 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14788 | + BPF_ALU64_REG(BPF_AND, BPF_REG_3, BPF_REG_2), |
| 14789 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), |
| 14790 | + BPF_EXIT_INSN(), |
| 14791 | + }, |
| 14792 | + .result = ACCEPT, |
| 14793 | + .retval = 46, |
| 14794 | + }, |
| 14795 | + { |
| 14796 | + "masking, test in bounds 8", |
| 14797 | + .insns = { |
| 14798 | + BPF_MOV64_IMM(BPF_REG_3, -47), |
| 14799 | + BPF_ALU64_IMM(BPF_MUL, BPF_REG_3, -1), |
| 14800 | + BPF_MOV32_IMM(BPF_REG_2, 47 - 1), |
| 14801 | + BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_3), |
| 14802 | + BPF_ALU64_REG(BPF_OR, BPF_REG_2, BPF_REG_3), |
| 14803 | + BPF_ALU64_IMM(BPF_NEG, BPF_REG_2, 0), |
| 14804 | + BPF_ALU64_IMM(BPF_ARSH, BPF_REG_2, 63), |
| 14805 | + BPF_ALU64_REG(BPF_AND, BPF_REG_3, BPF_REG_2), |
| 14806 | + BPF_MOV64_REG(BPF_REG_0, BPF_REG_3), |
| 14807 | + BPF_EXIT_INSN(), |
| 14808 | + }, |
| 14809 | + .result = ACCEPT, |
| 14810 | + .retval = 0, |
| 14811 | + }, |
| 13721 | 14812 | { |
| 13722 | 14813 | "reference tracking in call: free reference in subprog and outside", |
| 13723 | 14814 | .insns = { |
| @@ -14413,6 +15504,16 @@ static int create_map(uint32_t type, uint32_t size_key, · 689 unmodified lines |
| 14413 | 15504 | return fd; |
| 14414 | 15505 | } |
| 14415 | 15506 | |
| 15507 | +static void update_map(int fd, int index) |
| 15508 | +{ |
| 15509 | + struct test_val value = { |
| 15510 | + .index = (6 + 1) * sizeof(int), |
| 15511 | + .foo[6] = 0xabcdef12, |
| 15512 | + }; |
| 15513 | + |
| 15514 | + assert(!bpf_map_update_elem(fd, &index, &value, 0)); |
| 15515 | +} |
| 15516 | + |
| 14416 | 15517 | static int create_prog_dummy1(enum bpf_prog_type prog_type) |
| 14417 | 15518 | { |
| 14418 | 15519 | struct bpf_insn prog[] = { |
| @@ -14564,6 +15665,7 @@ static void do_test_fixup(struct bpf_test *test, enum bpf_prog_type prog_type, · 145 unmodified lines |
| 14564 | 15665 | if (*fixup_map_array_48b) { |
| 14565 | 15666 | map_fds[3] = create_map(BPF_MAP_TYPE_ARRAY, sizeof(int), |
| 14566 | 15667 | sizeof(struct test_val), 1); |
| 15668 | + update_map(map_fds[3], 0); |
| 14567 | 15669 | do { |
| 14568 | 15670 | prog[*fixup_map_array_48b].imm = map_fds[3]; |
| 14569 | 15671 | fixup_map_array_48b++; |