]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Check the status code from AllocatePool()
authorIgnat Korchagin <ignat@cloudflare.com>
Tue, 21 Jul 2020 21:27:08 +0000 (22:27 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 22 Jul 2020 11:54:18 +0000 (12:54 +0100)
According to the latest UEFI specification (Version 2.8 Errata B)
p. 7.2:

  "Buffer: A pointer to a pointer to the allocated buffer if the call
   succeeds; undefined otherwise."

So implementations are obliged neither to return NULL, if the
allocation fails, nor to preserve the contents of the pointer.

Make the logic more reliable by checking the status code from
AllocatePool() instead of checking the returned pointer for NULL

Signed-off-by: Ignat Korchagin <ignat@cloudflare.com>
Modified-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/interface/efi/efi_snp_hii.c

index 651bef040d8e16b3bae4a3ecac5c63e8723f9c95..1e681a429c63c95904aa48077882af3b15ee37a5 100644 (file)
@@ -247,16 +247,17 @@ static int efi_snp_hii_append ( struct efi_snp_device *snpdev __unused,
                                const char *key, const char *value,
                                wchar_t **results ) {
        EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
+       EFI_STATUS efirc;
        size_t len;
        void *new;
 
        /* Allocate new string */
        len = ( ( *results ? ( wcslen ( *results ) + 1 /* "&" */ ) : 0 ) +
                strlen ( key ) + 1 /* "=" */ + strlen ( value ) + 1 /* NUL */ );
-       bs->AllocatePool ( EfiBootServicesData, ( len * sizeof ( wchar_t ) ),
-                          &new );
-       if ( ! new )
-               return -ENOMEM;
+       if ( ( efirc = bs->AllocatePool ( EfiBootServicesData,
+                                         ( len * sizeof ( wchar_t ) ),
+                                         &new ) ) != 0 )
+               return -EEFI ( efirc );
 
        /* Populate string */
        efi_snprintf ( new, len, "%ls%s%s=%s", ( *results ? *results : L"" ),