[PATCH 2/2] discover/boot: unify verification failure messages
Joel Stanley
joel at jms.id.au
Thu Jan 23 23:03:02 AEDT 2020
On Thu, 23 Jan 2020 at 10:38, Joel Stanley <joel at jms.id.au> wrote:
>
> On Tue, 29 Oct 2019 at 09:26, Jeremy Kerr <jk at ozlabs.org> wrote:
> >
> > Currently, we have two sites where the result of validate_boot_files is
> > interpreted: in kexec_load, and boot_process. In the former, we generate
> > the pb_log message, and in the latter we generate the status message.
> >
> > This means we have separate places to maintain similar error messages,
> > which is prone to future errors. This change does all of the
> > interpretation directly after calling validate_boot_files().
> >
> > Signed-off-by: Jeremy Kerr <jk at ozlabs.org>
>
> Acked-by: Joel Stanley <joel at jms.id.au>
This is what we see on a system that cannot kexec, with your patches
applied. It cannot kexec as it has
CONFIG_LOCK_DOWN_KERNEL_FORCE_INTEGRITY=y (blocks the normal kexec
call) and CONFIG_KEXEC_FILE=n.
---
[11:48:19] boot status: [0] Performing kexec load
[11:48:19] device_handler_status: Performing kexec load
[11:48:19] Running command:
exe: /usr/sbin/kexec
argv: '/usr/sbin/kexec' '-l' '--debug'
'--initrd=/var/petitboot/mnt/dev/sda2/boot/initrd.img-4.15.0-52-generic'
'--dtb=/tmp/tmp.to4ypW'
'--append=root=UUID=c5a560f9-8c01-4209-86ce-3abe4298b7cc ro'
'/var/petitboot/mnt/dev/sda2/boot/vmlinux-4.15.0-52-generic'
[11:48:19] kexec_load: kexec load (-l) failed (rc 1): free memory map:
0x01dd0000-0x30000000
0x3bd04000-0x80000000
kernel offset 0x10000 paddr 0x0 filesz 24460736 memsz 27622200
add_kexec_segment kernel buf 0x7fff9a570010 bufsize 0x01753dc0,
dest 0x1dd0000, memsize 0x01a60000
add_kexec_segment initrd buf 0x7fff97df0010 bufsize 0x0277f14d,
dest 0x3830000, memsize 0x02780000
add_kexec_segment device tree buf 0x7fff9bcd0010 bufsize 0x0004e71b,
dest 0x7ffb0000, memsize 0x00050000
add_kexec_segment trampoline buf 0x31420680 bufsize 0x00000210, dest
0x7ffa0000, memsize 0x00010000
kexec syscall failed: Operation not permitted
[11:48:19] Running command:
exe: /usr/sbin/kexec
argv: '/usr/sbin/kexec' '-s' '--debug'
'--initrd=/var/petitboot/mnt/dev/sda2/boot/initrd.img-4.15.0-52-generic'
'--dtb=/tmp/tmp.to4ypW'
'--append=root=UUID=c5a560f9-8c01-4209-86ce-3abe4298b7cc ro'
'/var/petitboot/mnt/dev/sda2/boot/vmlinux-4.15.0-52-generic'
[11:48:19] kexec_load: kexec load (-s) failed (rc 1): kernel_fd=7
initrd_fd=11 cmdline_len=50 flags=0
cmdline="root=UUID=c5a560f9-8c01-4209-86ce-3abe4298b7cc ro"
do_file_load: (-1) Function not implemented
[11:48:19] boot status: [1] kexec load failed: kernel_fd=7
initrd_fd=11 cmdline_len=50 flags=0
cmdline="root=UUID=c5a560f9-8c01-4209-86ce-3abe4298b7cc ro"
do_file_load: (-1) Function not implemented
[11:48:19] device_handler_status: kexec load failed: kernel_fd=7
initrd_fd=11 cmdline_len=50 flags=0
cmdline="root=UUID=c5a560f9-8c01-4209-86ce-3abe4298b7cc ro"
do_file_load: (-1) Function not implemented
[11:48:19] Failed to load all boot resources
---
The user sees "kexec load failed: kernel_fd=7 initrd_fd=11
cmdline_len=50 flags=0" in the status. Could/should/can we instead
have it display the "Function not implemented" line?
Cheers,
Joel
>
> > ---
> > discover/boot.c | 45 ++++++++++++++++++++++-----------------------
> > 1 file changed, 22 insertions(+), 23 deletions(-)
> >
> > diff --git a/discover/boot.c b/discover/boot.c
> > index a6b88f0..9e7054b 100644
> > --- a/discover/boot.c
> > +++ b/discover/boot.c
> > @@ -75,16 +75,30 @@ static int kexec_load(struct boot_task *boot_task)
> > boot_task->local_dtb_override = NULL;
> > boot_task->local_image_override = NULL;
> >
> > - if ((result = validate_boot_files(boot_task))) {
> > - if (result == KEXEC_LOAD_DECRYPTION_FALURE) {
> > - pb_log("%s: Aborting kexec due to"
> > - " decryption failure\n", __func__);
> > - }
> > - if (result == KEXEC_LOAD_SIGNATURE_FAILURE) {
> > - pb_log("%s: Aborting kexec due to signature"
> > - " verification failure\n", __func__);
> > + result = validate_boot_files(boot_task);
> > + if (result) {
> > + const char *msg;
> > +
> > + switch (result) {
> > + case KEXEC_LOAD_DECRYPTION_FALURE:
> > + msg = _("decryption failed");
> > + break;
> > + case KEXEC_LOAD_SIGNATURE_FAILURE:
> > + msg = _("signature verification failed");
> > + break;
> > + case KEXEC_LOAD_SIG_SETUP_INVALID:
> > + msg = _("invalid signature configuration");
> > + break;
> > + default:
> > + msg = _("unknown verification failure");
> > }
> >
> > + update_status(boot_task->status_fn, boot_task->status_arg,
> > + STATUS_ERROR,
> > + _("Boot verification failure: %s"), msg);
> > + pb_log_fn("Aborting kexec due to verification failure: %s",
> > + msg);
> > +
> > validate_boot_files_cleanup(boot_task);
> > return result;
> > }
> > @@ -451,21 +465,6 @@ static void boot_process(struct load_url_result *result, void *data)
> > _("Performing kexec load"));
> >
> > rc = kexec_load(task);
> > - pb_log_fn("kexec_load returned %d\n", rc);
> > - if (rc == KEXEC_LOAD_DECRYPTION_FALURE) {
> > - update_status(task->status_fn, task->status_arg,
> > - STATUS_ERROR, _("Decryption failed"));
> > - }
> > - else if (rc == KEXEC_LOAD_SIGNATURE_FAILURE) {
> > - update_status(task->status_fn, task->status_arg,
> > - STATUS_ERROR,
> > - _("Signature verification failed"));
> > - }
> > - else if (rc == KEXEC_LOAD_SIG_SETUP_INVALID) {
> > - update_status(task->status_fn, task->status_arg,
> > - STATUS_ERROR,
> > - _("Invalid signature configuration"));
> > - }
> >
> > no_load:
> > list_for_each_entry(&task->resources, resource, list)
> > --
> > 2.20.1
> >
> > _______________________________________________
> > Petitboot mailing list
> > Petitboot at lists.ozlabs.org
> > https://lists.ozlabs.org/listinfo/petitboot
More information about the Petitboot
mailing list