summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2021-09-07More minor improvements to support for COMPILER=clangPeter Jones
A couple of places snuck in where building with COMPILER=clang didn't work right; this makes them work again. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-09-07Ignore a gcc issue in test-str.cPeter Jones
In 33db42def2ce, we switched a gcc bounds checking error in test-str.c to be a warning, due to it being obviously wrong and only occurring with some GCC optimization flags. For more details see the comment in test-str.c . It continues to be an issue, and the warning makes the -fanalyzer and similar tools even harder to read, so it's better to just turn it off. This is only in the test data, so if something really goes wrong we should see it in failures or in valgrind when running tests. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-09-07Add some more stuff to .gitignorePeter Jones
This adds compile_commands.json (used by https://github.com/neoclide/coc.nvim) and clangd's .cache/ directory to .gitignore. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-09-07Update gnu-efiPeter Jones
This updates gnu-efi to the shim-15.5 tag, with the following minor fixes: 5bd501b7e00 - Add missing EFI_VARIABLE_... definition. 9490cfe5bf2 - Check if we're using clang *before* we check the gcc version 3d2ba813d04 - Use CFLAGS_LTO and CFLAGS_GCOV variables during build 2186b121724 - Add some missing definitions for system table revisions acc5371207f - Make CopyMem() and SetMem() be EFIAPI With the exception of acc5371207f, all of these are needed for patches further along in this patch series. acc5371207f goes with the prior patch in this series ("Make CopyMem() work with EFI's declaration."), but they have to be applied in this order to keep from breaking the build. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-09-07mok: delete the existing RT variables only when only_first=TRUEGary Lin
For the firmware without the variable writing issues, MOK variables are mirrored when only_first=TRUE. However, LibDeleteVariable() was called in maybe_mirror_one_mok_variable() when only_first=FALSE, and this could delete MOK variables that were just mirrored in the first round. This bug was hidden since LibDeleteVariable() deletes BS+RT+NV variables while we mirror MOK variables as BS+RT, and the firmware refused to delete the mirrored MOK variable due to mismatching attributes. However, some firmwares, such as VMWare, didn't enforce the attribute check and just deleted the variables with matched name and GUID. In such system, MokListRT was always removed before it reached OS. Fixes: https://github.com/rhboot/shim/issues/386 Signed-off-by: Gary Lin <glin@suse.com>
2021-09-07Make CopyMem() work with EFI's declarationPeter Jones
EFI_BOOT_SERVICES includes CopyMem() and SetMem() functions which are marked EFIAPI, and in the case of CopyMem() does not mark the source argument as CONST. This patch makes all our invocations work with that, so (once gnu-efi's implementation is fixed to match) we can use the existing implementation as the implementation in a mock EFI_BOOT_SERVICES. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-09-03fallback: add compile option FALLBACK_NONINTERACTIVEDimitri John Ledkov
In the cloud, all boots are non-interactive with keyboard and console access either typically not available or prohibited. Also clouds always do firstboot via fallback. This currently results in an unacceptable 5s boot delay whilst fallback offers interactive reset options that cannot be actioned. In Ubuntu, we'd like to make fallback noninteractive by default without any boot delays, due to bootspeed impact on firstboot of the preinstalled images. Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/shim/+bug/1922581 Signed-off-by: Dimitri John Ledkov <xnox@ubuntu.com>
2021-09-03fallback: Use a dynamic buffer when list var namesJoão Paulo Rechi Vita
Now that we are iterating over all EFI variables to look for duplicate boot entries, we should use a dynamic buffer, so if the firmware tells us the buffer is too small for the next variable name we can re-allocate it to a big enough size. Signed-off-by: João Paulo Rechi Vita <jprvita@endlessos.org>
2021-09-03fallback: Print info on GetNextVariableName errorsJoão Paulo Rechi Vita
When listing all variables checking for duplicates, print which error was returned if not EFI_NOT_FOUND (which simply means reached the end of the list). Signed-off-by: João Paulo Rechi Vita <jprvita@endlessos.org>
2021-09-03str: remove duplicate parameter checkHeinrich Schuchardt
There is no need to check the parameters of strntoken() twice. Fixes: c7bb10cf154a ("Tidy up our string primitives...") Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
2021-09-03shim: avoid BOOTx64.EFI in message on other architecturesHeinrich Schuchardt
An error message complaining about missing file BOOTx64.EFI makes no sense on other architectures. Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
2021-09-03fallback: free the right variable on the read_file() error path.Peter Jones
Heinrich correctly noticed that read_file()'s memory allocation failure error path tested the wrong variable, and thus would never catch the error condition. The *next* error, file->Read() failing, has the same incorrect variable usage in its FreePool() invocation. This fixes it to free the right variable as well. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-09-03fallback: incorrect check after AllocateZeroPool()Heinrich Schuchardt
After calling AllocateZeroPool() we must check the returned pointer. Fixes: 3ce517fdbb4e ("Add a fallback loader for when shim is invoked as BOOTX64.EFI") Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
2021-09-01httpboot: Ignore case when checking HTTP headersRobbie Harwood
Some servers (HAProxy) yield Content-Length in lowercase, and shim would fail to find it. Signed-off-by: Robbie Harwood <rharwood@redhat.com>
2021-08-10fallback: find_boot_option() needs to return the index for the boot entry in ↵Jan Setje-Eilers
optnum The CopyMem() calls in add_to_boot_list() expect that find_boot_option() returned an index to the matching entry in the BootOrder array. The previous code returned the numerical portion of the boot entry label, which in some cases resulted in -1 * sizeof(CHAR16) being passed to CopyMem() which would in turn corrupt the running firmware resulting in an exception and a failure to boot or reset.
2021-07-20Don't unhook ExitBootServices() when EBS protection is disabledSeth Forshee
When EBS protection is disabled the code which hooks into EBS is complied out, but on unhook it's the code which restores Exit() that is disabled. This appears to be a mistake, and it can result in writing NULL to EBS in the boot services table. Fix this by moving the ifdefs to compile out the code to unhook EBS instead of the code to unhook Exit(). Also ifdef the definition of system_exit_boot_services to safeguard against its accidental use. Fixes: 4b0a61dc9a95 ("shim: compile time option to bypass the ExitBootServices() check") Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
2021-07-20mok: relax the maximum variable size checkGary Lin
Some UEFI environment such as u-boot doesn't implement QueryVariableInfo(), so we couldn't rely on the function to estimate the available space for RT variables. All we can do is to call SetVariable() directly and check the return value of SetVariable(). Signed-off-by: Gary Lin <glin@suse.com>
2021-07-20mok: fix potential buffer overrun in import_mok_stateJonathan Yong
Fix the case where data_size is 0, so config_template is not implicitly copied like the size calculation above. upstream-status: https://github.com/rhboot/shim/issues/249 Signed-off-by: Jonathan Yong <jonathan.yong@intel.com>
2021-07-20arm/aa64: fix the size of .rela* sectionsGary Lin
The previous commit(*) merged .rel* and .dyn* into .rodata, and this made ld to generate the wrong size for .rela* sections that covered other unrelated sections. When the EFI image was loaded, _relocate() went through the unexpected data and may cause unexpected crash. This commit moves .rel* and .dyn* out of .rodata in the ld script but also moves the related variables, such as _evrodata, _rodata_size, and _rodata_vsize, to the end of the new .dyn section, so that the crafted pe-coff section header for .rodata still covers our new .rela and .dyn sections. (*) 212ba30544f ("arm/aa64 targets: put .rel* and .dyn* in .rodata") Fix issue: https://github.com/rhboot/shim/issues/371 Signed-off-by: Gary Lin <glin@suse.com>
2021-07-20shim: don't fail on the odd LoadOptions lengthGary Lin
Some firmware feeds the LoadOptions with an odd length when booting from an USB device(*). We should only skip this kind of LoadOptions, not fail it, or the user won't be able to boot the system from USB or CD-ROM. (*) https://bugzilla.suse.com/show_bug.cgi?id=1185232#c62 Signed-off-by: Gary Lin <glin@suse.com>
2021-07-20Add a tester for parse_load_options()Peter Jones
This adds tests for all the cases we've documented in the set_second_stage() comments. Each test checks that all of second_stage, loader_str, and loader_str_size are set correctly. Note that this adds a dependency on libefivar to build device paths to test against. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-07-20shim: move the bulk of set_second_stage() to its own filePeter Jones
This moves set_second_stage() and some of the helper functions it uses out of shim.c, so that it's easier to write test cases for. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-07-20test: Add a basic traceback printerPeter Jones
Some tests have some complex flows, and it's useful to be able to see the call path when there's a failure. This patch adds a very simple traceback printer, along with changing the test build arguments to include more debug information. The result you get from this traceback printer just gives you a function name and the index into its .txt content, so to use it for more than "which function calls which", you'll need to use eu-addr2line with the output. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-07-20test.h: add assert_not_equal_*()Peter Jones
This test helper was conspicuously missing, so this patch just adds it at the obvious place. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-07-20test.c: add some simple mock functions for BS->{Allocate,Free}*Peter Jones
In some test cases, it may be useful to call libefi.a functions, such as the device path parsing functions, which allocate pages via BS->AllocatePool() or BS->AllocatePages. This patch ads a simple mock implementation of those functions, as well as the EFI_SYSTEM_TABLE, EFI_BOOT_SERVICES, and EFI_RUNTIME_SERVICES variables *ST, *BS, and *RT (respectively), and initializes them before the test cases run. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-07-20Make test cases link against libefi.aPeter Jones
This allows us to use library functions from libefi.a in our test programs. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-07-20test.c: Conditionally do not declare stuff that's in other placesPeter Jones
test.c duplicates a couple of objects (StrnCmp, StrCmp) that are in libefi.a, as well as SHIM_LOCK_GUID from lib/guid.o. While it's nice to have these at some places, we need to disable them if we're actually linking a test case against either of those. This patch adds HAVE_foo guards around those objects. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-07-20test.h: add some decls for some of the stuff in efilib.hPeter Jones
In some test cases, it's useful to be able to call some of the very common stuff in gnu-efi's efilib.h (i.e. CompareGuid()), but including that header itself is too big for me to tackle right now. This patch adds a few more decls to test.h. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-07-20test.h: make some of the asserts a little more friendly to pointer types.Peter Jones
Signed-off-by: Peter Jones <pjones@redhat.com>
2021-07-20shim: rename pause() to wait_for_debug()Peter Jones
pause() is a posix function, and having it named the same as this makes it hard to include the asm.h header in some test cases. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-07-20.gitignore: ignore .gdb*, not just .gdbinitPeter Jones
Signed-off-by: Peter Jones <pjones@redhat.com>
2021-07-20shim: another attempt to fix load options handlingChris Coulson
The load options handling is quite complicated and tries to accomodate several scenarios, but there are currently multiple issues: - If the supplied LoadOptions is an EFI_LOAD_OPTION structure, second_stage gets initialized to the entire contents of the OptionalData field and load_options is initialized to NULL, which means it isn't possible to pass additional options to the second stage loader (and it looks like the intention is for this to be supported). - If the supplied LoadOptions contains 2 or more strings, the code seems to assume that shim was executed from the UEFI shell and that the first argument is the path of the shim executable, so it's ignored. But this breaks the ability to pass additional options to the second stage loader from BDS on firmware implementations that initialize LoadOptions to just the OptionalData field of the EFI_LOAD_OPTION, which is what EDK2 seems to do. This is moot anyway because this case (strings == 2) doesn't actually seem to work, as nothing sets loader_len and therefore second_stage is not set to the custom loader path. - If the supplied LoadOptions contains a single string that isn't shim's path, nothing sets loader_len and therefore second_stage isn't set at the end of set_second_stage. - set_second_stage replaces L' ' characters with L'\0' - whilst this is useful to NULL terminate the path for the second stage, it doesn't seem quite right to do this for the remaining LoadOptions data. Grub's chainloader command supplies additional arguments as a NULL-terminated space-delimited string via LoadOptions. Making it NULL-delimited seems to be incompatible with the kernel's commandline handling, which wouldn't work for scenarios where you might want to direct-boot a kernel image (wrapped in systemd's EFI stub) from shim. - handle_image passes the original LoadOptions to the second stage if load_options is NULL, which means that the second stage currently always gets shim's load options. I've made an attempt to try to fix things. After the initial checks in set_second_stage, it now does this: - Tries to parse LoadOptions as an EFI_LOAD_OPTION in order to extract the OptionalData if it is. - If it's not an EFI_LOAD_OPTION, check if the first string is the current shim path and ignore it if it is (the UEFI shell case). - Split LoadOptions in to a single NULL terminated string (used to initialize second_stage) and the unmodified remaining data (used to initialize load_options and load_options_size). I've also modified handle_image to always set LoadOptions and LoadOptionsSize. If shim is executed with no options, or is only executed with a single option to override the second stage loader path, the second stage is executed with LoadOptions = NULL and LoadOptionsSize = 0 now. I've tested this on EDK2 and I can load a custom loader with extra options from both BDS and the UEFI shell: FS0:\> shimx64.efi test.efi LoadOptionsSize: 0 LoadOptions: (null) FS0:\> shimx64.efi test.efi LoadOptionsSize: 0 LoadOptions: (null) FS0:\> shimx64.efi test.efi foo bar LoadOptionsSize: 16 LoadOptions: foo bar
2021-07-15SBAT.md: fix "will should"Serge Hallyn
Use the stronger "will" rather than "will should". I'm not sure based on what's there, but suspect "must" would be appropriate instead? Signed-off-by: Serge Hallyn <serge@hallyn.com>
2021-07-15SBAT.md: trivial fixesSerge Hallyn
1. Use : instead of , to separate a list. 2. Fix spelling of therefore. 3. Pull unrelated clause out of parenthesized clause. Signed-off-by: Serge Hallyn <serge@hallyn.com>
2021-07-12Tweak how we call grub-install; don't abort on errordebian/15.4-7Steve McIntyre
Not ideal behaviour either, but don't break upgrades. Copy the behaviour from the grub packages here. Closes: #990966
2021-06-23Relax the check for import_mok_state()Gary Lin
An openSUSE user reported(*) that shim 15.4 failed to boot the system with the following message: "Could not create MokListXRT: Out of Resources" In the beginning, I thought it's caused by the growing size of vendor-dbx. However, we found the following messages after set SHIM_VERBOSE: max_var_sz:8000 remaining_sz:85EC max_storage_sz:9000 SetVariable(“MokListXRT”, ... varsz=0x1404) = Out of Resources Even though the firmware claimed the remaining storage size is 0x85EC and the maximum variable size is 0x8000, it still rejected MokListXRT with size 0x1404. It seems that the return values from QueryVariableInfo() are not reliable. Since this firmware didn't really support Secure Boot, the variable mirroring is not so critical, so we can just accept the failure of import_mok_state() and continue boot. (*) https://bugzilla.suse.com/show_bug.cgi?id=1185261 Signed-off-by: Gary Lin <glin@suse.com>
2021-06-23Release 15.4-6debian/15.4-6Steve McIntyre
2021-06-22In insecure mode, don't abort if we can't create the MokListXRT varSteve McIntyre
Upstream issue #372. Closes: #989962, #990158
2021-06-22Add arm64 patch to tweak section layout and stop crashing problemsSteve McIntyre
Upstream issue #371. Closes: #990082, #990190
2021-05-25Post-process our PE to be sure.Peter Jones
On some versions of binutils[0], including binutils-2.23.52.0.1-55.el7, do not correctly initialize the data when computing the PE optional header checksum. Unfortunately, this means that any time you get a build that reproduces correctly using the version of objcopy from those versions, it's just a matter of luck. This patch introduces a new utility program, post-process-pe, which does some basic validation of the resulting binaries, and if necessary, performs some minor repairs: - sets the timestamp to 0 - this was previously done with dd using constant offsets that aren't really safe. - re-computes the checksum. [0] I suspect, but have not yet fully verified, that this is accidentally fixed by the following upstream binutils commit: commit cf7a3c01d82abdf110ef85ab770e5997d8ac28ac Author: Alan Modra <amodra@gmail.com> Date: Tue Dec 15 22:09:30 2020 +1030 Lose some COFF/PE static vars, and peicode.h constify This patch tidies some COFF and PE code that unnecessarily used static variables to communicate between functions. v2 - MAP_PRIVATE was totally wrong... Signed-off-by: Peter Jones <pjones@redhat.com>
2021-05-24Don't call QueryVariableInfo() on EFI 1.10 machinesPeter Jones
The EFI 1.10 spec (and presumably earlier revisions as well) didn't have RT->QueryVariableInfo(), and on Chris Murphy's MacBookPro8,2 , that memory appears to be initialized randomly. This patch changes it to not call RT->QueryVariableInfo() if the EFI_RUNTIME_SERVICES table's major revision is less than two, and assumes our maximum variable size is 1024 in that case. Signed-off-by: Peter Jones <pjones@redhat.com>
2021-05-06Add defensive code around calls to db_getdebian/15.4-5Steve McIntyre
Don't fail if they return errors.
2021-05-04Fix up the template maintainer scriptsdebian/15.4-4Steve McIntyre
if we're not running on an EFI system then exit cleanly
2021-05-03Add maintainer scripts to the template packagesdebian/15.4-3Steve McIntyre
Manage installing and removing fbXXX.efi and mmXXX.efi when we install/remove the shim-helpers-$arch-signed packages. Closes: #966845
2021-04-21Add changelog for 15.4-2 with new patchesdebian/15.4-2Steve McIntyre
2021-04-21Don't call QueryVariableInfo() on EFI 1.10 machinesSteve McIntyre
New patch from upstream, don't break old Macs
2021-04-21Fix handling of ignore_db and user_insecure_modeSteve McIntyre
Extra patch from upstream
2021-04-17Stop hardcoding the release version in the rules filedebian/15.4-1Steve McIntyre
We can grab it from the changelog already
2021-04-17Clean more thingsSteve McIntyre
2021-04-17Prep for releasing based on 15.4Steve McIntyre