bpf: Fix bad unlock balance on freeze_mutex
authorDaniel Borkmann <daniel@iogearbox.net>
Fri, 26 May 2023 10:13:56 +0000 (12:13 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 26 May 2023 10:16:12 +0000 (12:16 +0200)
Commit c4c84f6fb2c4 ("bpf: drop unnecessary bpf_capable() check in
BPF_MAP_FREEZE command") moved the permissions check outside of the
freeze_mutex in the map_freeze() handler. The error paths still jumps
to the err_put which tries to unlock the freeze_mutex even though it
was not locked in the first place. Fix it.

Fixes: c4c84f6fb2c4 ("bpf: drop unnecessary bpf_capable() check in BPF_MAP_FREEZE command")
Reported-by: syzbot+8982e75c2878b9ffeac5@syzkaller.appspotmail.com
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
kernel/bpf/syscall.c

index c9a201e..92a57ef 100644 (file)
@@ -1932,8 +1932,8 @@ static int map_freeze(const union bpf_attr *attr)
        }
 
        if (!(map_get_sys_perms(map, f) & FMODE_CAN_WRITE)) {
-               err = -EPERM;
-               goto err_put;
+               fdput(f);
+               return -EPERM;
        }
 
        mutex_lock(&map->freeze_mutex);