diff options
| author | Peter Jones <pjones@redhat.com> | 2022-12-05 17:57:36 -0500 |
|---|---|---|
| committer | Peter Jones <pjones@redhat.com> | 2022-12-07 10:45:23 -0500 |
| commit | 657b2483ca6e9fcf2ad8ac7ee577ff546d24c3aa (patch) | |
| tree | dcee3df773efd3e523e2188ad33ff4ffc1a40e63 | |
| parent | 11491619f4336fef41c3519877ba242161763580 (diff) | |
| download | efi-boot-shim-657b2483ca6e9fcf2ad8ac7ee577ff546d24c3aa.tar.gz efi-boot-shim-657b2483ca6e9fcf2ad8ac7ee577ff546d24c3aa.zip | |
Make sbat_var.S parse right with buggy gcc/binutils
In https://github.com/rhboot/shim/issues/533 , iokomin noticed that
gas in binutils before 2.36 appears to be incorrectly concatenating
string literals in '.asciz' directives, including an extra NUL character
in between the strings, and this will cause us to incorrectly parse the
.sbatlevel section in shim binaries.
This patch adds test cases that will cause the build to fail if this has
happened, as well as changing sbat_var.S to to use '.ascii' and '.byte'
to construct the data, rather than using '.asciz'.
Signed-off-by: Peter Jones <pjones@redhat.com>
| -rw-r--r-- | include/test.mk | 2 | ||||
| -rw-r--r-- | sbat_var.S | 6 | ||||
| -rw-r--r-- | test-sbat.c | 32 |
3 files changed, 37 insertions, 3 deletions
diff --git a/include/test.mk b/include/test.mk index c0e24095..c37b8446 100644 --- a/include/test.mk +++ b/include/test.mk @@ -92,7 +92,7 @@ test-mock-variables: CFLAGS+=-DHAVE_SHIM_LOCK_GUID test-mok-mirror_FILES = mok.c globals.c tpm.c lib/guid.c lib/variables.c mock-variables.c test-mok-mirror: CFLAGS+=-DHAVE_START_IMAGE -DHAVE_SHIM_LOCK_GUID -test-sbat_FILES = csv.c lib/variables.c lib/guid.c sbat_var.S +test-sbat_FILES = csv.c lib/variables.c lib/guid.c sbat_var.S mock-variables.c test-sbat :: CFLAGS+=-DHAVE_GET_VARIABLE -DHAVE_GET_VARIABLE_ATTR -DHAVE_SHIM_LOCK_GUID test-str_FILES = lib/string.c @@ -14,7 +14,9 @@ sbat_var_payload_header: .Lsbat_var_payload_header_end: .balign 1, 0 .Lsbat_var_previous: - .asciz SBAT_VAR_PREVIOUS + .ascii SBAT_VAR_PREVIOUS + .byte 0 .balign 1, 0 .Lsbat_var_latest: - .asciz SBAT_VAR_LATEST + .ascii SBAT_VAR_LATEST + .byte 0 diff --git a/test-sbat.c b/test-sbat.c index 72bebe7a..65bc6a84 100644 --- a/test-sbat.c +++ b/test-sbat.c @@ -1107,6 +1107,36 @@ test_preserve_sbat_uefi_variable_bad_short(void) return 0; } +static int +test_sbat_var_asciz(void) +{ + EFI_STATUS status; + char buf[1024] = ""; + UINT32 attrs = 0; + UINTN size = sizeof(buf); + char expected[] = SBAT_VAR_PREVIOUS; + + status = set_sbat_uefi_variable(); + if (status != EFI_SUCCESS) + return -1; + + status = RT->GetVariable(SBAT_VAR_NAME, &SHIM_LOCK_GUID, &attrs, &size, buf); + if (status != EFI_SUCCESS) + return -1; + + /* + * this should be enough to get past "sbat,", which handles the + * first error. + */ + if (size < (strlen(SBAT_VAR_SIG) + 2) || size != strlen(expected)) + return -1; + + if (strncmp(expected, buf, size) != 0) + return -1; + + return 0; +} + int main(void) { @@ -1155,6 +1185,8 @@ main(void) test(test_preserve_sbat_uefi_variable_version_older); test(test_preserve_sbat_uefi_variable_version_olderlonger); + test(test_sbat_var_asciz); + return 0; } |
