mirror of
https://review.coreboot.org/flashrom.git
synced 2025-04-27 23:22:37 +02:00
cbtable.c: Factor out lb_header_validation logic
Write a pure function for the header validation logic, it is easier to unit-test. Change-Id: Ia288bcbc5c371329952a6efba30ccf0e18965a3d Signed-off-by: Edward O'Callaghan <quasisec@chromium.org> Reviewed-on: https://review.coreboot.org/c/flashrom/+/37238 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org> Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
This commit is contained in:
parent
61e16e549a
commit
4a55e68858
32
cbtable.c
32
cbtable.c
@ -151,6 +151,25 @@ static unsigned int count_lb_records(struct lb_header *head)
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int lb_header_valid(struct lb_header *head, unsigned long addr)
|
||||||
|
{
|
||||||
|
if (memcmp(head->signature, "LBIO", 4) != 0)
|
||||||
|
return 0;
|
||||||
|
msg_pdbg("Found candidate at: %08lx-%08lx\n",
|
||||||
|
addr, addr + sizeof(*head) + head->table_bytes);
|
||||||
|
if (head->header_bytes != sizeof(*head)) {
|
||||||
|
msg_perr("Header bytes of %d are incorrect.\n",
|
||||||
|
head->header_bytes);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (compute_checksum((uint8_t *) head, sizeof(*head)) != 0) {
|
||||||
|
msg_perr("Bad header checksum.\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static struct lb_header *find_lb_table(void *base, unsigned long start,
|
static struct lb_header *find_lb_table(void *base, unsigned long start,
|
||||||
unsigned long end)
|
unsigned long end)
|
||||||
{
|
{
|
||||||
@ -162,24 +181,13 @@ static struct lb_header *find_lb_table(void *base, unsigned long start,
|
|||||||
(struct lb_header *)(((char *)base) + addr);
|
(struct lb_header *)(((char *)base) + addr);
|
||||||
struct lb_record *recs =
|
struct lb_record *recs =
|
||||||
(struct lb_record *)(((char *)base) + addr + sizeof(*head));
|
(struct lb_record *)(((char *)base) + addr + sizeof(*head));
|
||||||
if (memcmp(head->signature, "LBIO", 4) != 0)
|
if (!lb_header_valid(head, addr))
|
||||||
continue;
|
continue;
|
||||||
msg_pdbg("Found candidate at: %08lx-%08lx\n",
|
|
||||||
addr, addr + head->table_bytes);
|
|
||||||
if (head->header_bytes != sizeof(*head)) {
|
|
||||||
msg_perr("Header bytes of %d are incorrect.\n",
|
|
||||||
head->header_bytes);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (count_lb_records(head) != head->table_entries) {
|
if (count_lb_records(head) != head->table_entries) {
|
||||||
msg_perr("Bad record count: %d.\n",
|
msg_perr("Bad record count: %d.\n",
|
||||||
head->table_entries);
|
head->table_entries);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (compute_checksum((uint8_t *) head, sizeof(*head)) != 0) {
|
|
||||||
msg_perr("Bad header checksum.\n");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (compute_checksum(recs, head->table_bytes)
|
if (compute_checksum(recs, head->table_bytes)
|
||||||
!= head->table_checksum) {
|
!= head->table_checksum) {
|
||||||
msg_perr("Bad table checksum: %04x.\n",
|
msg_perr("Bad table checksum: %04x.\n",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user