summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnastasia Klimchuk <aklm@flashrom.org>2023-11-09 23:29:41 +1100
committerAnastasia Klimchuk <aklm@chromium.org>2024-01-15 02:01:31 +0000
commit48b9ece5ad011573eddadc09d6854fc1b82c5cd0 (patch)
tree1feef9869f9e90a05d29cd603d9bb2a1442ba127
parentbb8e6f904b8297731ddd5f27e1270c00b155cd57 (diff)
downloadflashrom-48b9ece5ad011573eddadc09d6854fc1b82c5cd0.tar.gz
flashrom-48b9ece5ad011573eddadc09d6854fc1b82c5cd0.tar.bz2
flashrom-48b9ece5ad011573eddadc09d6854fc1b82c5cd0.zip
erasure_layout: Fix unaligned region end offset by 1
In the case when layout region is not aligned with eraseblock, end region boundary is extended to match the eraseblock. There is a special handling of this extended area (between original end of region and extended one). Fix the offset of this extended area by +1 so that it covers the extended area and not the original region. Before the patch, the last byte of the original region was failed to write since it was treated as if an extended area, while it was the last byte of the normal layout region. Ticket: https://ticket.coreboot.org/issues/494 Change-Id: I7f78a0090065cd2a952cba1a5d28179483ba4c55 Signed-off-by: Anastasia Klimchuk <aklm@flashrom.org> Reviewed-on: https://review.coreboot.org/c/flashrom/+/78984 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Peter Marheine <pmarheine@chromium.org>
-rw-r--r--erasure_layout.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/erasure_layout.c b/erasure_layout.c
index c60305f5f..1dd6b6032 100644
--- a/erasure_layout.c
+++ b/erasure_layout.c
@@ -279,9 +279,10 @@ int erase_write(struct flashctx *const flashctx, chipoff_t region_start, chipoff
memcpy(newcontents + region_start, curcontents + region_start, old_start - region_start);
}
if (region_end - old_end) {
- read_flash(flashctx, curcontents + old_end, old_end, region_end - old_end);
- memcpy(old_end_buf, newcontents + old_end, region_end - old_end);
- memcpy(newcontents + old_end, curcontents + old_end, region_end - old_end);
+ chipoff_t end_offset = old_end + 1;
+ read_flash(flashctx, curcontents + end_offset, end_offset, region_end - old_end);
+ memcpy(old_end_buf, newcontents + end_offset, region_end - old_end);
+ memcpy(newcontents + end_offset, curcontents + end_offset, region_end - old_end);
}
// select erase functions