diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/bpf/syscall.c | 7 | ||||
-rw-r--r-- | kernel/bpf/verifier.c | 2 |
2 files changed, 8 insertions, 1 deletions
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 85cbeec06e50..f9554d9a14e1 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c | |||
@@ -1452,9 +1452,14 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr) | |||
1452 | if (CHECK_ATTR(BPF_PROG_LOAD)) | 1452 | if (CHECK_ATTR(BPF_PROG_LOAD)) |
1453 | return -EINVAL; | 1453 | return -EINVAL; |
1454 | 1454 | ||
1455 | if (attr->prog_flags & ~BPF_F_STRICT_ALIGNMENT) | 1455 | if (attr->prog_flags & ~(BPF_F_STRICT_ALIGNMENT | BPF_F_ANY_ALIGNMENT)) |
1456 | return -EINVAL; | 1456 | return -EINVAL; |
1457 | 1457 | ||
1458 | if (!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && | ||
1459 | (attr->prog_flags & BPF_F_ANY_ALIGNMENT) && | ||
1460 | !capable(CAP_SYS_ADMIN)) | ||
1461 | return -EPERM; | ||
1462 | |||
1458 | /* copy eBPF program license from user space */ | 1463 | /* copy eBPF program license from user space */ |
1459 | if (strncpy_from_user(license, u64_to_user_ptr(attr->license), | 1464 | if (strncpy_from_user(license, u64_to_user_ptr(attr->license), |
1460 | sizeof(license) - 1) < 0) | 1465 | sizeof(license) - 1) < 0) |
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 9584438fa2cc..71988337ac14 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c | |||
@@ -6505,6 +6505,8 @@ int bpf_check(struct bpf_prog **prog, union bpf_attr *attr, | |||
6505 | env->strict_alignment = !!(attr->prog_flags & BPF_F_STRICT_ALIGNMENT); | 6505 | env->strict_alignment = !!(attr->prog_flags & BPF_F_STRICT_ALIGNMENT); |
6506 | if (!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)) | 6506 | if (!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)) |
6507 | env->strict_alignment = true; | 6507 | env->strict_alignment = true; |
6508 | if (attr->prog_flags & BPF_F_ANY_ALIGNMENT) | ||
6509 | env->strict_alignment = false; | ||
6508 | 6510 | ||
6509 | ret = replace_map_fd_with_map_ptr(env); | 6511 | ret = replace_map_fd_with_map_ptr(env); |
6510 | if (ret < 0) | 6512 | if (ret < 0) |