efivarfs: Move efivarfs list into superblock s_fs_info
authorArd Biesheuvel <ardb@kernel.org>
Fri, 8 Dec 2023 16:39:29 +0000 (17:39 +0100)
committerArd Biesheuvel <ardb@kernel.org>
Mon, 11 Dec 2023 10:19:18 +0000 (11:19 +0100)
commitcdb46a8aefbf7fd36772bb206aaaf7e45d7cf8f6
treeb0eb3387296b811d060af9ce3e5f57b2b9d392ae
parent547713d502f7b4b8efccd409cff84d731a23853b
efivarfs: Move efivarfs list into superblock s_fs_info

syzbot reports issues with concurrent fsopen()/fsconfig() invocations on
efivarfs, which are the result of the fact that the efivarfs list (which
caches the names and GUIDs of existing EFI variables) is a global
structure. In normal use, these issues are unlikely to trigger, even in
the presence of multiple mounts of efivarfs, but the execution pattern
used by the syzkaller reproducer may result in multiple instances of the
superblock that share the global efivarfs list, and this causes list
corruption when the list is reinitialized by one user while another is
traversing it.

So let's move the list head into the superblock s_fs_info field, so that
it will never be shared between distinct instances of the superblock. In
the common case, there will still be a single instance of this list, but
in the artificial syzkaller case, no list corruption can occur any
longer.

Reported-by: syzbot+1902c359bfcaf39c46f2@syzkaller.appspotmail.com
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
fs/efivarfs/inode.c
fs/efivarfs/internal.h
fs/efivarfs/super.c
fs/efivarfs/vars.c