_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] == '.')
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] == '.')
* 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