Message ID | 20171122031859.12600-1-jsg@jsg.id.au |
---|---|
State | Accepted |
Commit | b6e9e09770035b4606c408e800f28231dcca9e98 |
Delegated to: | Alexander Graf |
Headers | show |
Series | [U-Boot,v2] efi_loader: initialise partition_signature memory | expand |
On Wed, Nov 22, 2017 at 02:18:59PM +1100, Jonathan Gray wrote: > Zero partition_signature in the efi_device_path_hard_drive_path > structure when signature_type is 0 (no signature) as required by the > UEFI specification. > > This is required so that efi_dp_match() will work as expected > when doing memcmp() comparisons. Previously uninitialised memory > would cause it not match nodes when it should have when the signature > type was not GUID. > > Corrects a problem where the loaded image protocol would not return a > device path with MEDIA_DEVICE causing the OpenBSD bootloader to fail > on rpi_3 and other targets. > > v2: Also handle signature_type 1 (MBR) as described in the specification > > Signed-off-by: Jonathan Gray <jsg@jsg.id.au> Tested-by: Artturi Alm <artturi.alm@gmail.com> Tested with Marsboard_A10_defconfig. Thanks, -Artturi > --- > lib/efi_loader/efi_device_path.c | 21 +++++++++++++++++++-- > 1 file changed, 19 insertions(+), 2 deletions(-) > > diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c > index f6e368e029..12a81d311c 100644 > --- a/lib/efi_loader/efi_device_path.c > +++ b/lib/efi_loader/efi_device_path.c > @@ -427,10 +427,27 @@ static void *dp_part_fill(void *buf, struct blk_desc *desc, int part) > hddp->partmap_type = 2; > else > hddp->partmap_type = 1; > - hddp->signature_type = desc->sig_type; > - if (hddp->signature_type != 0) > + > + switch (desc->sig_type) { > + case SIG_TYPE_NONE: > + default: > + hddp->signature_type = 0; > + memset(hddp->partition_signature, 0, > + sizeof(hddp->partition_signature)); > + break; > + case SIG_TYPE_MBR: > + hddp->signature_type = 1; > + memset(hddp->partition_signature, 0, > + sizeof(hddp->partition_signature)); > + memcpy(hddp->partition_signature, &desc->mbr_sig, > + sizeof(desc->mbr_sig)); > + break; > + case SIG_TYPE_GUID: > + hddp->signature_type = 2; > memcpy(hddp->partition_signature, &desc->guid_sig, > sizeof(hddp->partition_signature)); > + break; > + } > > buf = &hddp[1]; > } > -- > 2.15.0 > > _______________________________________________ > U-Boot mailing list > U-Boot@lists.denx.de > https://lists.denx.de/listinfo/u-boot
> Zero partition_signature in the efi_device_path_hard_drive_path > structure when signature_type is 0 (no signature) as required by the > UEFI specification. > > This is required so that efi_dp_match() will work as expected > when doing memcmp() comparisons. Previously uninitialised memory > would cause it not match nodes when it should have when the signature > type was not GUID. > > Corrects a problem where the loaded image protocol would not return a > device path with MEDIA_DEVICE causing the OpenBSD bootloader to fail > on rpi_3 and other targets. > > v2: Also handle signature_type 1 (MBR) as described in the specification > > Signed-off-by: Jonathan Gray <jsg@jsg.id.au> > Tested-by: Artturi Alm <artturi.alm@gmail.com> Thanks, applied to efi-next Alex
diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c index f6e368e029..12a81d311c 100644 --- a/lib/efi_loader/efi_device_path.c +++ b/lib/efi_loader/efi_device_path.c @@ -427,10 +427,27 @@ static void *dp_part_fill(void *buf, struct blk_desc *desc, int part) hddp->partmap_type = 2; else hddp->partmap_type = 1; - hddp->signature_type = desc->sig_type; - if (hddp->signature_type != 0) + + switch (desc->sig_type) { + case SIG_TYPE_NONE: + default: + hddp->signature_type = 0; + memset(hddp->partition_signature, 0, + sizeof(hddp->partition_signature)); + break; + case SIG_TYPE_MBR: + hddp->signature_type = 1; + memset(hddp->partition_signature, 0, + sizeof(hddp->partition_signature)); + memcpy(hddp->partition_signature, &desc->mbr_sig, + sizeof(desc->mbr_sig)); + break; + case SIG_TYPE_GUID: + hddp->signature_type = 2; memcpy(hddp->partition_signature, &desc->guid_sig, sizeof(hddp->partition_signature)); + break; + } buf = &hddp[1]; }
Zero partition_signature in the efi_device_path_hard_drive_path structure when signature_type is 0 (no signature) as required by the UEFI specification. This is required so that efi_dp_match() will work as expected when doing memcmp() comparisons. Previously uninitialised memory would cause it not match nodes when it should have when the signature type was not GUID. Corrects a problem where the loaded image protocol would not return a device path with MEDIA_DEVICE causing the OpenBSD bootloader to fail on rpi_3 and other targets. v2: Also handle signature_type 1 (MBR) as described in the specification Signed-off-by: Jonathan Gray <jsg@jsg.id.au> --- lib/efi_loader/efi_device_path.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-)