]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Nullify interfaces unconditionally on error and shutdown paths
authorMichael Brown <mcb30@ipxe.org>
Thu, 17 Dec 2020 19:48:08 +0000 (19:48 +0000)
committerMichael Brown <mcb30@ipxe.org>
Thu, 17 Dec 2020 19:52:41 +0000 (19:52 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/interface/efi/efi_block.c
src/interface/efi/efi_pxe.c
src/interface/efi/efi_snp.c
src/interface/efi/efi_snp_hii.c

index 19f669fd2a5d056da6ef6ea62e26be7fcc2ab751..eeae8fca54ef70699dabceb6f9fcf6b1d9c7fb02 100644 (file)
@@ -326,9 +326,9 @@ static int efi_block_hook ( unsigned int drive, struct uri **uris,
                        NULL ) ) != 0 ) {
                DBGC ( sandev, "EFIBLK %#02x could not uninstall protocols: "
                       "%s\n", sandev->drive, strerror ( -EEFI ( efirc ) ) );
-               efi_nullify_block ( &block->block_io );
                leak = 1;
        }
+       efi_nullify_block ( &block->block_io );
  err_install:
        if ( ! leak )  {
                free ( block->path );
@@ -377,9 +377,9 @@ static void efi_block_unhook ( unsigned int drive ) {
                        NULL ) ) != 0 ) {
                DBGC ( sandev, "EFIBLK %#02x could not uninstall protocols: "
                       "%s\n", sandev->drive, strerror ( -EEFI ( efirc ) ) );
-               efi_nullify_block ( &block->block_io );
                leak = 1;
        }
+       efi_nullify_block ( &block->block_io );
 
        /* Free device path */
        if ( ! leak ) {
index 4422dd28360927abe3bb03bba4049b7796ad6790..5c7bb950ce76142605104dd8e14278a76739b87a 100644 (file)
@@ -1652,10 +1652,10 @@ int efi_pxe_install ( EFI_HANDLE handle, struct net_device *netdev ) {
                        NULL ) ) != 0 ) {
                DBGC ( pxe, "PXE %s could not uninstall: %s\n",
                       pxe->name, strerror ( -EEFI ( efirc ) ) );
-               efi_nullify_pxe ( &pxe->base );
-               efi_nullify_apple ( &pxe->apple );
                leak = 1;
        }
+       efi_nullify_pxe ( &pxe->base );
+       efi_nullify_apple ( &pxe->apple );
  err_install_protocol:
        if ( ! leak )
                ref_put ( &pxe->refcnt );
@@ -1695,10 +1695,10 @@ void efi_pxe_uninstall ( EFI_HANDLE handle ) {
                        NULL ) ) != 0 ) {
                DBGC ( pxe, "PXE %s could not uninstall: %s\n",
                       pxe->name, strerror ( -EEFI ( efirc ) ) );
-               efi_nullify_pxe ( &pxe->base );
-               efi_nullify_apple ( &pxe->apple );
                leak = 1;
        }
+       efi_nullify_pxe ( &pxe->base );
+       efi_nullify_apple ( &pxe->apple );
 
        /* Remove from list and drop list's reference */
        list_del ( &pxe->list );
index 0a280eef4390a54b58ad03ad9a4cfc1118027fc6..c08383e49c7da7c2769a2fdf0298b97e93347a8b 100644 (file)
@@ -1816,12 +1816,12 @@ static int efi_snp_probe ( struct net_device *netdev ) {
                        NULL ) ) != 0 ) {
                DBGC ( snpdev, "SNPDEV %p could not uninstall: %s\n",
                       snpdev, strerror ( -EEFI ( efirc ) ) );
-               efi_nullify_snp ( &snpdev->snp );
-               efi_nullify_nii ( &snpdev->nii );
-               efi_nullify_name2 ( &snpdev->name2 );
-               efi_nullify_load_file ( &snpdev->load_file );
                leak = 1;
        }
+       efi_nullify_snp ( &snpdev->snp );
+       efi_nullify_nii ( &snpdev->nii );
+       efi_nullify_name2 ( &snpdev->name2 );
+       efi_nullify_load_file ( &snpdev->load_file );
  err_install_protocol_interface:
        if ( ! leak )
                free ( snpdev->path );
@@ -1903,12 +1903,12 @@ static void efi_snp_remove ( struct net_device *netdev ) {
                        NULL ) ) != 0 ) {
                DBGC ( snpdev, "SNPDEV %p could not uninstall: %s\n",
                       snpdev, strerror ( -EEFI ( efirc ) ) );
-               efi_nullify_snp ( &snpdev->snp );
-               efi_nullify_nii ( &snpdev->nii );
-               efi_nullify_name2 ( &snpdev->name2 );
-               efi_nullify_load_file ( &snpdev->load_file );
                leak = 1;
        }
+       efi_nullify_snp ( &snpdev->snp );
+       efi_nullify_nii ( &snpdev->nii );
+       efi_nullify_name2 ( &snpdev->name2 );
+       efi_nullify_load_file ( &snpdev->load_file );
        if ( ! leak )
                free ( snpdev->path );
        bs->CloseEvent ( snpdev->snp.WaitForPacket );
index 4bb7214ff7c2e2e6cfb3a93c6adce582e110def6..8ca8e69173babfda58a631e47a169967ea13ebea 100644 (file)
@@ -759,9 +759,9 @@ int efi_snp_hii_install ( struct efi_snp_device *snpdev ) {
                        NULL ) ) != 0 ) {
                DBGC ( snpdev, "SNPDEV %p could not uninstall HII protocol: "
                       "%s\n", snpdev, strerror ( -EEFI ( efirc ) ) );
-               efi_nullify_hii ( &snpdev->hii );
                leak = 1;
        }
+       efi_nullify_hii ( &snpdev->hii );
  err_install_protocol:
        if ( ! leak )
                efihii->RemovePackageList ( efihii, snpdev->hii_handle );
@@ -812,9 +812,9 @@ int efi_snp_hii_uninstall ( struct efi_snp_device *snpdev ) {
                        NULL ) ) != 0 ) {
                DBGC ( snpdev, "SNPDEV %p could not uninstall HII protocol: "
                       "%s\n", snpdev, strerror ( -EEFI ( efirc ) ) );
-               efi_nullify_hii ( &snpdev->hii );
                leak = 1;
        }
+       efi_nullify_hii ( &snpdev->hii );
        if ( ! leak )
                efihii->RemovePackageList ( efihii, snpdev->hii_handle );
        if ( ( efirc = bs->UninstallMultipleProtocolInterfaces (