|
@@ -48,6 +48,32 @@ static const struct bpf_map_ops * const bpf_map_types[] = {
|
|
|
#undef BPF_MAP_TYPE
|
|
|
};
|
|
|
|
|
|
+static int check_uarg_tail_zero(void __user *uaddr,
|
|
|
+ size_t expected_size,
|
|
|
+ size_t actual_size)
|
|
|
+{
|
|
|
+ unsigned char __user *addr;
|
|
|
+ unsigned char __user *end;
|
|
|
+ unsigned char val;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ if (actual_size <= expected_size)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ addr = uaddr + expected_size;
|
|
|
+ end = uaddr + actual_size;
|
|
|
+
|
|
|
+ for (; addr < end; addr++) {
|
|
|
+ err = get_user(val, addr);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+ if (val)
|
|
|
+ return -E2BIG;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static struct bpf_map *find_and_alloc_map(union bpf_attr *attr)
|
|
|
{
|
|
|
struct bpf_map *map;
|
|
@@ -1246,32 +1272,6 @@ static int bpf_map_get_fd_by_id(const union bpf_attr *attr)
|
|
|
return fd;
|
|
|
}
|
|
|
|
|
|
-static int check_uarg_tail_zero(void __user *uaddr,
|
|
|
- size_t expected_size,
|
|
|
- size_t actual_size)
|
|
|
-{
|
|
|
- unsigned char __user *addr;
|
|
|
- unsigned char __user *end;
|
|
|
- unsigned char val;
|
|
|
- int err;
|
|
|
-
|
|
|
- if (actual_size <= expected_size)
|
|
|
- return 0;
|
|
|
-
|
|
|
- addr = uaddr + expected_size;
|
|
|
- end = uaddr + actual_size;
|
|
|
-
|
|
|
- for (; addr < end; addr++) {
|
|
|
- err = get_user(val, addr);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
- if (val)
|
|
|
- return -E2BIG;
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
static int bpf_prog_get_info_by_fd(struct bpf_prog *prog,
|
|
|
const union bpf_attr *attr,
|
|
|
union bpf_attr __user *uattr)
|