From: Lennart Poettering Date: Fri, 17 Apr 2026 12:58:46 +0000 (+0200) Subject: boot: gracefully handle LoadFile() implementations that return EFI_SUCCESS with a... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c40f254cca5e96b876b90e20ced69c33115940c3;p=thirdparty%2Fsystemd.git boot: gracefully handle LoadFile() implementations that return EFI_SUCCESS with a NULL buffer LoadFile() with a NULL buffer is supposed to return the file size without acquiring the data and return EFI_BUFFER_TOO_SMALL. However it appears some firmware returns EFI_SUCCESS in case the file is empty, i.e. the file size returned is zero. And I guess that's even fine. Let's handle this gracefully hence. --- diff --git a/src/boot/boot.c b/src/boot/boot.c index 34ba4f2b7e4..df5ce31fa3a 100644 --- a/src/boot/boot.c +++ b/src/boot/boot.c @@ -2719,7 +2719,12 @@ static EFI_STATUS expand_path( if (IN_SET(err, EFI_NOT_FOUND, EFI_INVALID_PARAMETER)) continue; /* Skip over LoadFile() handles that after all don't consider themselves * appropriate for this kind of path */ - if (err != EFI_BUFFER_TOO_SMALL) { + if (!IN_SET(err, EFI_SUCCESS, EFI_BUFFER_TOO_SMALL)) { + /* NB: firmwares are supposed to return EFI_BUFFER_TOO_SMALL whenever we pass a NULL + * buffer. But for compatibility with quirky firmwares let's be lenient for the + * special case of a zero sized file: the firmware might return EFI_SUCCESS here and + * initialize the size to zero, as a buffer is not actually necessary for that + * case. */ log_warning_status(err, "Failed to get file via LoadFile() protocol, ignoring: %m"); continue; }