mirror of
https://github.com/fail0verflow/switch-coreboot.git
synced 2025-05-04 01:39:18 -04:00
UPSTREAM: ifdtool: avoid potential unaligned pointer usage
In get_region, ifdtool assigns a not-known-to-be-aligned
pointer to a uint32_t *. Now you know and I know that it is
almost certainly aligned, but clang on OSX doesn't like this,
and it's a dicey thing to do in any event, just waiting
to hit someone hard at some future date.
Assign the pointer to a void * and use memmove to copy
the value to a uint32_t.
This usage is more portable to all little-endian architectures,
now, but is still not endian-safe. I doubt we'll ever care.
BUG=none
BRANCH=none
TEST=none
Change-Id: I85be85b9e78c74dde72584f848441a6ddd0ec0c2
Signed-off-by: Patrick Georgi <pgeorgi@chromium.org>
Original-Commit-Id: 8db3c2a485
Original-Change-Id: Ifb2f260c3363ab0f5b4a59e5a4e0b5ecf049fa96
Original-Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Original-Reviewed-on: https://review.coreboot.org/19921
Original-Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Original-Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Reviewed-on: https://chromium-review.googlesource.com/522709
This commit is contained in:
parent
538972ebd8
commit
33d4ebe304
1 changed files with 14 additions and 12 deletions
|
@ -105,7 +105,8 @@ static region_t get_region(frba_t *frba, int region_type)
|
|||
{
|
||||
int base_mask;
|
||||
int limit_mask;
|
||||
uint32_t *flreg;
|
||||
uint32_t flreg;
|
||||
void *v;
|
||||
region_t region;
|
||||
|
||||
if (ifd_version >= IFD_VERSION_2)
|
||||
|
@ -117,39 +118,40 @@ static region_t get_region(frba_t *frba, int region_type)
|
|||
|
||||
switch (region_type) {
|
||||
case 0:
|
||||
flreg = &frba->flreg0;
|
||||
v = &frba->flreg0;
|
||||
break;
|
||||
case 1:
|
||||
flreg = &frba->flreg1;
|
||||
v = &frba->flreg1;
|
||||
break;
|
||||
case 2:
|
||||
flreg = &frba->flreg2;
|
||||
v = &frba->flreg2;
|
||||
break;
|
||||
case 3:
|
||||
flreg = &frba->flreg3;
|
||||
v = &frba->flreg3;
|
||||
break;
|
||||
case 4:
|
||||
flreg = &frba->flreg4;
|
||||
v = &frba->flreg4;
|
||||
break;
|
||||
case 5:
|
||||
flreg = &frba->flreg5;
|
||||
v = &frba->flreg5;
|
||||
break;
|
||||
case 6:
|
||||
flreg = &frba->flreg6;
|
||||
v = &frba->flreg6;
|
||||
break;
|
||||
case 7:
|
||||
flreg = &frba->flreg7;
|
||||
v = &frba->flreg7;
|
||||
break;
|
||||
case 8:
|
||||
flreg = &frba->flreg8;
|
||||
v = &frba->flreg8;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Invalid region type %d.\n", region_type);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
region.base = (*flreg & base_mask) << 12;
|
||||
region.limit = ((*flreg & limit_mask) >> 4) | 0xfff;
|
||||
memmove(&flreg, v, sizeof(flreg));
|
||||
region.base = (flreg & base_mask) << 12;
|
||||
region.limit = ((flreg & limit_mask) >> 4) | 0xfff;
|
||||
region.size = region.limit - region.base + 1;
|
||||
|
||||
if (region.size < 0)
|
||||
|
|
Loading…
Add table
Reference in a new issue