summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEdward O'Callaghan <quasisec@chromium.org>2019-11-26 23:28:05 +1100
committerEdward O'Callaghan <quasisec@chromium.org>2019-11-28 10:00:11 +0000
commit4a55e6885816aa2a45314975686356ce282cae5c (patch)
treee689df39d5b23b188196c98fa5feb4ad5b85afee
parent61e16e549a52194ac80ef40504f2dc661d1ff99c (diff)
downloadflashrom-4a55e6885816aa2a45314975686356ce282cae5c.tar.gz
flashrom-4a55e6885816aa2a45314975686356ce282cae5c.tar.bz2
flashrom-4a55e6885816aa2a45314975686356ce282cae5c.zip
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>
-rw-r--r--cbtable.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/cbtable.c b/cbtable.c
index bdf53ce38..669a4619d 100644
--- a/cbtable.c
+++ b/cbtable.c
@@ -151,6 +151,25 @@ static unsigned int count_lb_records(struct lb_header *head)
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,
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_record *recs =
(struct lb_record *)(((char *)base) + addr + sizeof(*head));
- if (memcmp(head->signature, "LBIO", 4) != 0)
- 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);
+ if (!lb_header_valid(head, addr))
continue;
- }
if (count_lb_records(head) != head->table_entries) {
msg_perr("Bad record count: %d.\n",
head->table_entries);
continue;
}
- if (compute_checksum((uint8_t *) head, sizeof(*head)) != 0) {
- msg_perr("Bad header checksum.\n");
- continue;
- }
if (compute_checksum(recs, head->table_bytes)
!= head->table_checksum) {
msg_perr("Bad table checksum: %04x.\n",