summaryrefslogtreecommitdiffstats
path: root/src/include/ipxe/efi/efi_null.h
diff options
context:
space:
mode:
authorMichael Brown2020-10-26 16:10:18 +0100
committerMichael Brown2020-10-26 16:24:00 +0100
commit5b41b9a80ffb365376d8d522675a8d248a8717ab (patch)
tree74a87587b08135b0694b29c981671467ada3acc5 /src/include/ipxe/efi/efi_null.h
parent[efi] Allow block devices to provide their own EFI device paths (diff)
downloadipxe-5b41b9a80ffb365376d8d522675a8d248a8717ab.tar.gz
ipxe-5b41b9a80ffb365376d8d522675a8d248a8717ab.tar.xz
ipxe-5b41b9a80ffb365376d8d522675a8d248a8717ab.zip
[efi] Nullify interfaces and leak memory on uninstallation failure
The UEFI specification allows uninstallation of a protocol interface to fail. There is no sensible way for code to react to this, since uninstallation is likely to be taking place on a code path that cannot itself fail (e.g. a code path that is itself a failure path). Where the protocol structure exists within a dynamically allocated block of memory, this leads to possible use-after-free bugs. Work around this unfortunate design choice by nullifying the protocol (i.e. overwriting the method pointers with no-ops) and leaking the memory containing the protocol structure. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/include/ipxe/efi/efi_null.h')
-rw-r--r--src/include/ipxe/efi/efi_null.h31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/include/ipxe/efi/efi_null.h b/src/include/ipxe/efi/efi_null.h
new file mode 100644
index 000000000..cc91e09bb
--- /dev/null
+++ b/src/include/ipxe/efi/efi_null.h
@@ -0,0 +1,31 @@
+#ifndef _IPXE_EFI_NULL_H
+#define _IPXE_EFI_NULL_H
+
+/** @file
+ *
+ * EFI null interfaces
+ *
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+
+#include <ipxe/efi/efi.h>
+#include <ipxe/efi/Protocol/AppleNetBoot.h>
+#include <ipxe/efi/Protocol/BlockIo.h>
+#include <ipxe/efi/Protocol/ComponentName2.h>
+#include <ipxe/efi/Protocol/HiiConfigAccess.h>
+#include <ipxe/efi/Protocol/LoadFile.h>
+#include <ipxe/efi/Protocol/NetworkInterfaceIdentifier.h>
+#include <ipxe/efi/Protocol/PxeBaseCode.h>
+#include <ipxe/efi/Protocol/SimpleNetwork.h>
+
+extern void efi_nullify_snp ( EFI_SIMPLE_NETWORK_PROTOCOL *snp );
+extern void efi_nullify_nii ( EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *nii );
+extern void efi_nullify_name2 ( EFI_COMPONENT_NAME2_PROTOCOL *name2 );
+extern void efi_nullify_load_file ( EFI_LOAD_FILE_PROTOCOL *load_file );
+extern void efi_nullify_hii ( EFI_HII_CONFIG_ACCESS_PROTOCOL *hii );
+extern void efi_nullify_block ( EFI_BLOCK_IO_PROTOCOL *block );
+extern void efi_nullify_pxe ( EFI_PXE_BASE_CODE_PROTOCOL *pxe );
+extern void efi_nullify_apple ( EFI_APPLE_NET_BOOT_PROTOCOL *apple );
+
+#endif /* _IPXE_EFI_NULL_H */