summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorHeinrich Schuchardt <xypron.glpk@gmx.de>2020-07-01 20:01:52 +0200
committerHeinrich Schuchardt <xypron.glpk@gmx.de>2020-07-03 18:03:24 +0200
commit28164c925ef02082f6320542acee744f8712ae9c (patch)
tree2c2214edc98cbe6f12e8793a5441b9344b7ae754 /lib
parentbc246c69aecea107f7286da928ac3c2494109979 (diff)
efi_loader: fix efi_image_region_add()
Use start and end address consistently as half-open interval. Simplify the code. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Diffstat (limited to 'lib')
-rw-r--r--lib/efi_loader/efi_signature.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/lib/efi_loader/efi_signature.c b/lib/efi_loader/efi_signature.c
index 3a634d7b57..e05c471c61 100644
--- a/lib/efi_loader/efi_signature.c
+++ b/lib/efi_loader/efi_signature.c
@@ -521,15 +521,19 @@ out:
}
/**
- * efi_image_region_add - add an entry of region
+ * efi_image_region_add() - add an entry of region
* @regs: Pointer to array of regions
- * @start: Start address of region
- * @end: End address of region
+ * @start: Start address of region (included)
+ * @end: End address of region (excluded)
* @nocheck: flag against overlapped regions
*
- * Take one entry of region [@start, @end] and append it to the list
- * pointed to by @regs. If @nocheck is false, overlapping among entries
- * will be checked first.
+ * Take one entry of region [@start, @end[ and insert it into the list.
+ *
+ * * If @nocheck is false, the list will be sorted ascending by address.
+ * Overlapping entries will not be allowed.
+ *
+ * * If @nocheck is true, the list will be sorted ascending by sequence
+ * of adding the entries. Overlapping is allowed.
*
* Return: status code
*/
@@ -553,22 +557,21 @@ efi_status_t efi_image_region_add(struct efi_image_regions *regs,
if (nocheck)
continue;
- if (start > reg->data + reg->size)
+ /* new data after registered region */
+ if (start >= reg->data + reg->size)
continue;
- if ((start >= reg->data && start < reg->data + reg->size) ||
- (end > reg->data && end < reg->data + reg->size)) {
- EFI_PRINT("%s: new region already part of another\n",
- __func__);
- return EFI_INVALID_PARAMETER;
- }
-
- if (start < reg->data && end < reg->data + reg->size) {
+ /* new data preceding registered region */
+ if (end <= reg->data) {
for (j = regs->num - 1; j >= i; j--)
- memcpy(&regs->reg[j], &regs->reg[j + 1],
+ memcpy(&regs->reg[j + 1], &regs->reg[j],
sizeof(*reg));
break;
}
+
+ /* new data overlapping registered region */
+ EFI_PRINT("%s: new region already part of another\n", __func__);
+ return EFI_INVALID_PARAMETER;
}
reg = &regs->reg[i];