Commit aeaa97b0 authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Alexei Starovoitov
Browse files

bpf: Fail BPF_TOKEN_CREATE if no delegation option was set on BPF FS



It's quite confusing in practice when it's possible to successfully
create a BPF token from BPF FS that didn't have any of delegate_xxx
mount options set up. While it's not wrong, it's actually more
meaningful to reject BPF_TOKEN_CREATE with specific error code (-ENOENT)
to let user-space know that no token delegation is setup up.

So, instead of creating empty BPF token that will be always ignored
because it doesn't have any of the allow_xxx bits set, reject it with
-ENOENT. If we ever need empty BPF token to be possible, we can support
that with extra flag passed into BPF_TOKEN_CREATE.

Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Acked-by: default avatarChristian Brauner <brauner@kernel.org>
Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20240124022127.2379740-19-andrii@kernel.org
parent 0054493e
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -162,6 +162,15 @@ int bpf_token_create(union bpf_attr *attr)
		goto out_path;
	}

	mnt_opts = path.dentry->d_sb->s_fs_info;
	if (mnt_opts->delegate_cmds == 0 &&
	    mnt_opts->delegate_maps == 0 &&
	    mnt_opts->delegate_progs == 0 &&
	    mnt_opts->delegate_attachs == 0) {
		err = -ENOENT; /* no BPF token delegation is set up */
		goto out_path;
	}

	mode = S_IFREG | ((S_IRUSR | S_IWUSR) & ~current_umask());
	inode = bpf_get_inode(path.mnt->mnt_sb, NULL, mode);
	if (IS_ERR(inode)) {
@@ -191,7 +200,6 @@ int bpf_token_create(union bpf_attr *attr)
	/* remember bpffs owning userns for future ns_capable() checks */
	token->userns = get_user_ns(userns);

	mnt_opts = path.dentry->d_sb->s_fs_info;
	token->allowed_cmds = mnt_opts->delegate_cmds;
	token->allowed_maps = mnt_opts->delegate_maps;
	token->allowed_progs = mnt_opts->delegate_progs;