summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Snowberg <eric.snowberg@oracle.com>2023-08-29 13:33:15 -0400
committerPeter Jones <pjones@redhat.com>2025-02-06 15:13:23 -0500
commit38dfa37ec218bda0dd6bb5c4ce9e6ecb05fda851 (patch)
treea8309f4e6b764b99e561d0d5c2f4b03a4cf4dafa
parent7ae0ee698a7e65057bb4d5322d3aabe2f435954e (diff)
downloadefi-boot-shim-38dfa37ec218bda0dd6bb5c4ce9e6ecb05fda851.tar.gz
efi-boot-shim-38dfa37ec218bda0dd6bb5c4ce9e6ecb05fda851.zip
Create utils file
Move some functions currently used within fallback that will later also be used in shim. Signed-off-by: Eric Snowberg <eric.snowberg@oracle.com>
-rw-r--r--Makefile2
-rw-r--r--fallback.c83
-rw-r--r--include/utils.h9
-rw-r--r--shim.h1
-rw-r--r--utils.c86
5 files changed, 97 insertions, 84 deletions
diff --git a/Makefile b/Makefile
index 97a35b7c..257f343b 100644
--- a/Makefile
+++ b/Makefile
@@ -43,7 +43,7 @@ KEYS = shim_cert.h ocsp.* ca.* shim.crt shim.csr shim.p12 shim.pem shim.key shim
ORIG_SOURCES = shim.c globals.c mok.c netboot.c dp.c replacements.c tpm.c errlog.c sbat.c pe.c pe-relocate.c httpboot.c shim.h version.h $(wildcard include/*.h) cert.S sbat_var.S
MOK_OBJS = MokManager.o PasswordCrypt.o crypt_blowfish.o errlog.o sbat_data.o globals.o dp.o
ORIG_MOK_SOURCES = MokManager.c PasswordCrypt.c crypt_blowfish.c shim.h $(wildcard include/*.h)
-FALLBACK_OBJS = fallback.o tpm.o errlog.o sbat_data.o globals.o
+FALLBACK_OBJS = fallback.o tpm.o errlog.o sbat_data.o globals.o utils.o
ORIG_FALLBACK_SRCS = fallback.c
SBATPATH = $(TOPDIR)/data/sbat.csv
diff --git a/fallback.c b/fallback.c
index c5e35e5a..5a4786d6 100644
--- a/fallback.c
+++ b/fallback.c
@@ -94,89 +94,6 @@ FindSubDevicePath(EFI_DEVICE_PATH *In, UINT8 Type, UINT8 SubType,
return EFI_NOT_FOUND;
}
-static EFI_STATUS
-get_file_size(EFI_FILE_HANDLE fh, UINTN *retsize)
-{
- EFI_STATUS efi_status;
- void *buffer = NULL;
- UINTN bs = 0;
-
- /* The API here is "Call it once with bs=0, it fills in bs,
- * then allocate a buffer and ask again to get it filled. */
- efi_status = fh->GetInfo(fh, &EFI_FILE_INFO_GUID, &bs, NULL);
- if (EFI_ERROR(efi_status) && efi_status != EFI_BUFFER_TOO_SMALL)
- return efi_status;
- if (bs == 0)
- return EFI_SUCCESS;
-
- buffer = AllocateZeroPool(bs);
- if (!buffer) {
- console_print(L"Could not allocate memory\n");
- return EFI_OUT_OF_RESOURCES;
- }
- efi_status = fh->GetInfo(fh, &EFI_FILE_INFO_GUID, &bs, buffer);
- /* This checks *either* the error from the first GetInfo, if it isn't
- * the EFI_BUFFER_TOO_SMALL we're expecting, or the second GetInfo
- * call in *any* case. */
- if (EFI_ERROR(efi_status)) {
- console_print(L"Could not get file info: %r\n", efi_status);
- if (buffer)
- FreePool(buffer);
- return efi_status;
- }
- EFI_FILE_INFO *fi = buffer;
- *retsize = fi->FileSize;
- FreePool(buffer);
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-read_file(EFI_FILE_HANDLE fh, CHAR16 *fullpath, CHAR16 **buffer, UINT64 *bs)
-{
- EFI_FILE_HANDLE fh2;
- EFI_STATUS efi_status;
-
- efi_status = fh->Open(fh, &fh2, fullpath, EFI_FILE_READ_ONLY, 0);
- if (EFI_ERROR(efi_status)) {
- console_print(L"Couldn't open \"%s\": %r\n", fullpath, efi_status);
- return efi_status;
- }
-
- UINTN len = 0;
- CHAR16 *b = NULL;
- efi_status = get_file_size(fh2, &len);
- if (EFI_ERROR(efi_status)) {
- console_print(L"Could not get file size for \"%s\": %r\n",
- fullpath, efi_status);
- fh2->Close(fh2);
- return efi_status;
- }
-
- if (len > 1024 * PAGE_SIZE) {
- fh2->Close(fh2);
- return EFI_BAD_BUFFER_SIZE;
- }
-
- b = AllocateZeroPool(len + 2);
- if (!b) {
- console_print(L"Could not allocate memory\n");
- fh2->Close(fh2);
- return EFI_OUT_OF_RESOURCES;
- }
-
- efi_status = fh->Read(fh, &len, b);
- if (EFI_ERROR(efi_status)) {
- FreePool(b);
- fh2->Close(fh2);
- console_print(L"Could not read file: %r\n", efi_status);
- return efi_status;
- }
- *buffer = b;
- *bs = len;
- fh2->Close(fh2);
- return EFI_SUCCESS;
-}
-
EFI_STATUS
make_full_path(CHAR16 *dirname, CHAR16 *filename, CHAR16 **out, UINT64 *outlen)
{
diff --git a/include/utils.h b/include/utils.h
new file mode 100644
index 00000000..654f05d8
--- /dev/null
+++ b/include/utils.h
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+#ifndef UTILS_H_
+#define UTILS_H_
+
+EFI_STATUS get_file_size(EFI_FILE_HANDLE fh, UINTN *retsize);
+EFI_STATUS
+read_file(EFI_FILE_HANDLE fh, CHAR16 *fullpath, CHAR16 **buffer, UINT64 *bs);
+
+#endif /* UTILS_H_ */
diff --git a/shim.h b/shim.h
index c0d8aa95..43fcb191 100644
--- a/shim.h
+++ b/shim.h
@@ -188,6 +188,7 @@
#include "include/simple_file.h"
#include "include/str.h"
#include "include/tpm.h"
+#include "include/utils.h"
#include "include/cc.h"
#include "include/ucs2.h"
#include "include/variables.h"
diff --git a/utils.c b/utils.c
new file mode 100644
index 00000000..02722294
--- /dev/null
+++ b/utils.c
@@ -0,0 +1,86 @@
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+
+#include "shim.h"
+
+EFI_STATUS
+get_file_size(EFI_FILE_HANDLE fh, UINTN *retsize)
+{
+ EFI_STATUS efi_status;
+ void *buffer = NULL;
+ UINTN bs = 0;
+
+ /* The API here is "Call it once with bs=0, it fills in bs,
+ * then allocate a buffer and ask again to get it filled. */
+ efi_status = fh->GetInfo(fh, &EFI_FILE_INFO_GUID, &bs, NULL);
+ if (EFI_ERROR(efi_status) && efi_status != EFI_BUFFER_TOO_SMALL)
+ return efi_status;
+ if (bs == 0)
+ return EFI_SUCCESS;
+
+ buffer = AllocateZeroPool(bs);
+ if (!buffer) {
+ console_print(L"Could not allocate memory\n");
+ return EFI_OUT_OF_RESOURCES;
+ }
+ efi_status = fh->GetInfo(fh, &EFI_FILE_INFO_GUID, &bs, buffer);
+ /* This checks *either* the error from the first GetInfo, if it isn't
+ * the EFI_BUFFER_TOO_SMALL we're expecting, or the second GetInfo
+ * call in *any* case. */
+ if (EFI_ERROR(efi_status)) {
+ console_print(L"Could not get file info: %r\n", efi_status);
+ if (buffer)
+ FreePool(buffer);
+ return efi_status;
+ }
+ EFI_FILE_INFO *fi = buffer;
+ *retsize = fi->FileSize;
+ FreePool(buffer);
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+read_file(EFI_FILE_HANDLE fh, CHAR16 *fullpath, CHAR16 **buffer, UINT64 *bs)
+{
+ EFI_FILE_HANDLE fh2;
+ EFI_STATUS efi_status;
+
+ efi_status = fh->Open(fh, &fh2, fullpath, EFI_FILE_READ_ONLY, 0);
+ if (EFI_ERROR(efi_status)) {
+ console_print(L"Couldn't open \"%s\": %r\n", fullpath, efi_status);
+ return efi_status;
+ }
+
+ UINTN len = 0;
+ CHAR16 *b = NULL;
+ efi_status = get_file_size(fh2, &len);
+ if (EFI_ERROR(efi_status)) {
+ console_print(L"Could not get file size for \"%s\": %r\n",
+ fullpath, efi_status);
+ fh2->Close(fh2);
+ return efi_status;
+ }
+
+ if (len > 1024 * PAGE_SIZE) {
+ fh2->Close(fh2);
+ return EFI_BAD_BUFFER_SIZE;
+ }
+
+ b = AllocateZeroPool(len + 2);
+ if (!b) {
+ console_print(L"Could not allocate memory\n");
+ fh2->Close(fh2);
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ efi_status = fh->Read(fh, &len, b);
+ if (EFI_ERROR(efi_status)) {
+ FreePool(b);
+ fh2->Close(fh2);
+ console_print(L"Could not read file: %r\n", efi_status);
+ return efi_status;
+ }
+ *buffer = b;
+ *bs = len;
+ fh2->Close(fh2);
+ return EFI_SUCCESS;
+}