|
@@ -212,6 +212,7 @@ static void bpf_map_free_deferred(struct work_struct *work)
|
|
|
struct bpf_map *map = container_of(work, struct bpf_map, work);
|
|
|
|
|
|
bpf_map_uncharge_memlock(map);
|
|
|
+ security_bpf_map_free(map);
|
|
|
/* implementation dependent freeing */
|
|
|
map->ops->map_free(map);
|
|
|
}
|
|
@@ -325,6 +326,12 @@ static const struct file_operations bpf_map_fops = {
|
|
|
|
|
|
int bpf_map_new_fd(struct bpf_map *map, int flags)
|
|
|
{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = security_bpf_map(map, OPEN_FMODE(flags));
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
return anon_inode_getfd("bpf-map", &bpf_map_fops, map,
|
|
|
flags | O_CLOEXEC);
|
|
|
}
|
|
@@ -405,10 +412,14 @@ static int map_create(union bpf_attr *attr)
|
|
|
atomic_set(&map->refcnt, 1);
|
|
|
atomic_set(&map->usercnt, 1);
|
|
|
|
|
|
- err = bpf_map_charge_memlock(map);
|
|
|
+ err = security_bpf_map_alloc(map);
|
|
|
if (err)
|
|
|
goto free_map_nouncharge;
|
|
|
|
|
|
+ err = bpf_map_charge_memlock(map);
|
|
|
+ if (err)
|
|
|
+ goto free_map_sec;
|
|
|
+
|
|
|
err = bpf_map_alloc_id(map);
|
|
|
if (err)
|
|
|
goto free_map;
|
|
@@ -430,6 +441,8 @@ static int map_create(union bpf_attr *attr)
|
|
|
|
|
|
free_map:
|
|
|
bpf_map_uncharge_memlock(map);
|
|
|
+free_map_sec:
|
|
|
+ security_bpf_map_free(map);
|
|
|
free_map_nouncharge:
|
|
|
map->ops->map_free(map);
|
|
|
return err;
|
|
@@ -914,6 +927,7 @@ static void __bpf_prog_put_rcu(struct rcu_head *rcu)
|
|
|
|
|
|
free_used_maps(aux);
|
|
|
bpf_prog_uncharge_memlock(aux->prog);
|
|
|
+ security_bpf_prog_free(aux);
|
|
|
bpf_prog_free(aux->prog);
|
|
|
}
|
|
|
|
|
@@ -972,6 +986,12 @@ static const struct file_operations bpf_prog_fops = {
|
|
|
|
|
|
int bpf_prog_new_fd(struct bpf_prog *prog)
|
|
|
{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = security_bpf_prog(prog);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
return anon_inode_getfd("bpf-prog", &bpf_prog_fops, prog,
|
|
|
O_RDWR | O_CLOEXEC);
|
|
|
}
|
|
@@ -1111,10 +1131,14 @@ static int bpf_prog_load(union bpf_attr *attr)
|
|
|
if (!prog)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- err = bpf_prog_charge_memlock(prog);
|
|
|
+ err = security_bpf_prog_alloc(prog->aux);
|
|
|
if (err)
|
|
|
goto free_prog_nouncharge;
|
|
|
|
|
|
+ err = bpf_prog_charge_memlock(prog);
|
|
|
+ if (err)
|
|
|
+ goto free_prog_sec;
|
|
|
+
|
|
|
prog->len = attr->insn_cnt;
|
|
|
|
|
|
err = -EFAULT;
|
|
@@ -1172,6 +1196,8 @@ free_used_maps:
|
|
|
free_used_maps(prog->aux);
|
|
|
free_prog:
|
|
|
bpf_prog_uncharge_memlock(prog);
|
|
|
+free_prog_sec:
|
|
|
+ security_bpf_prog_free(prog->aux);
|
|
|
free_prog_nouncharge:
|
|
|
bpf_prog_free(prog);
|
|
|
return err;
|
|
@@ -1640,6 +1666,10 @@ SYSCALL_DEFINE3(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned int, siz
|
|
|
if (copy_from_user(&attr, uattr, size) != 0)
|
|
|
return -EFAULT;
|
|
|
|
|
|
+ err = security_bpf(cmd, &attr, size);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+
|
|
|
switch (cmd) {
|
|
|
case BPF_MAP_CREATE:
|
|
|
err = map_create(&attr);
|