bpf: drop unnecessary bpf_capable() check in BPF_MAP_FREEZE command
authorAndrii Nakryiko <andrii@kernel.org>
Wed, 24 May 2023 22:54:19 +0000 (15:54 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 25 May 2023 17:08:20 +0000 (10:08 -0700)
Seems like that extra bpf_capable() check in BPF_MAP_FREEZE handler was
unintentionally left when we switched to a model that all BPF map
operations should be allowed regardless of CAP_BPF (or any other
capabilities), as long as process got BPF map FD somehow.

This patch replaces bpf_capable() check in BPF_MAP_FREEZE handler with
writeable access check, given conceptually freezing the map is modifying
it: map becomes unmodifiable for subsequent updates.

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/r/20230524225421.1587859-2-andrii@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/syscall.c

index c7f6807215e60542ddd2870ee84234d00c676fde..c9a201e4c4572f0f0d0911f76ff7502738f2491a 100644 (file)
@@ -1931,6 +1931,11 @@ static int map_freeze(const union bpf_attr *attr)
                return -ENOTSUPP;
        }
 
+       if (!(map_get_sys_perms(map, f) & FMODE_CAN_WRITE)) {
+               err = -EPERM;
+               goto err_put;
+       }
+
        mutex_lock(&map->freeze_mutex);
        if (bpf_map_write_active(map)) {
                err = -EBUSY;
@@ -1940,10 +1945,6 @@ static int map_freeze(const union bpf_attr *attr)
                err = -EBUSY;
                goto err_put;
        }
-       if (!bpf_capable()) {
-               err = -EPERM;
-               goto err_put;
-       }
 
        WRITE_ONCE(map->frozen, true);
 err_put: