Hi all, On Tue, Mar 03, 2020 at 05:24:58AM -0500, Vladis Dronov wrote: > Hello, Ard, all, > > > > Wouldn't it be easier to pass a var_data_size stack variable into > > > efivar_entry_get(), and only update the value in 'var' if it is <= > > > 1024? > > > > > > > I was thinking about this approach, but this way we still do not protect > > var from a concurrent access. For example, efivar_data_read() can race > > with itself: > > Oh, indeed, this race is not possible the way you sugget with a var_data_size > stack variable. Unfortunately, AFAIU, the read/write race stays: > > > ... efivar read functions still can race with the write function > > efivar_store_raw(). Surely, the race window is much smaller but it is there. > > I strongly believe we need to protect all data accesses here with a lock. > Looks that kernel uses EFI protocol to query variable everytime, then why should kernel keeps a copy of variable data size, data and attributes in memory? It makes sense to keep VariableName and VendorGuid, but why data? The efi_variable can be used to interactive with userland. But we do not need to keep a data copy in efi_variable with efivar_entry. e.g. The efivarfs_file_read() allocates a buffer for reading variable instead of using efi_variable->Data. Regards Joey Lee