From: Jan Janssen Date: Mon, 10 Jan 2022 10:16:26 +0000 (+0100) Subject: boot: Fix readdir_harder() on VirtualBox X-Git-Tag: v251-rc1~555 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ed3abbfbde674bd163cb1c64d9e31dd24e352f85;p=thirdparty%2Fsystemd.git boot: Fix readdir_harder() on VirtualBox Fixes: #22073 --- diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c index 189461974ba..6ff1768d9b6 100644 --- a/src/boot/efi/boot.c +++ b/src/boot/efi/boot.c @@ -1577,7 +1577,7 @@ static void config_load_entries( _cleanup_freepool_ CHAR8 *content = NULL; err = readdir_harder(entries_dir, &f, &f_size); - if (f_size == 0 || EFI_ERROR(err)) + if (EFI_ERROR(err) || !f) break; if (f->FileName[0] == '.') @@ -2019,7 +2019,7 @@ static void config_entry_add_linux( CHAR8 *key, *value; err = readdir_harder(linux_dir, &f, &f_size); - if (f_size == 0 || EFI_ERROR(err)) + if (EFI_ERROR(err) || !f) break; if (f->FileName[0] == '.') diff --git a/src/boot/efi/util.c b/src/boot/efi/util.c index ab21d774a25..db998ca8da9 100644 --- a/src/boot/efi/util.c +++ b/src/boot/efi/util.c @@ -592,7 +592,12 @@ EFI_STATUS readdir_harder( * the specified buffer needs to be freed by caller, after final use. */ if (!*buffer) { - sz = offsetof(EFI_FILE_INFO, FileName) /* + 256 */; + /* Some broken firmware violates the EFI spec by still advancing the readdir + * position when returning EFI_BUFFER_TOO_SMALL, effectively skipping over any files when + * the buffer was too small. Therefore, start with a buffer that should handle FAT32 max + * file name length. + * As a side effect, most readdir_harder() calls will now be slightly faster. */ + sz = sizeof(EFI_FILE_INFO) + 256 * sizeof(CHAR16); *buffer = xallocate_pool(sz); *buffer_size = sz; } else