[U-Boot] [PATCH v1] disk: part_efi: fix check of the max partition size
Patrick Delaunay
patrick.delaunay73 at gmail.com
Mon May 2 14:43:33 CEST 2016
the last value acceptable value for offset is last_usable_lba + 1
and not last_usable_lba - 1
issue found with SDCARD partition commands on u-boot 2015.10
but this part of code don't change
1- create GPT partion on all the card
> gpt write mmc 0 name=test,start=0,size=0
> part list mmc 0
Partition Map for MMC device 0 -- Partition Type: EFI
Part Start LBA End LBA Name
Attributes
Type GUID
Partition GUID
1 0x00000022 0x003a9fde "test"
attrs: 0x0000000000000000
type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
type: data
guid: b710eb04-45b9-e94a-8d0b-21458d596f54
=> Start = 0x22*512 = 0x4400
=> Size = (0x003a9fde-0x22+1) * 512 = 0x753F7A00
2- try to recreate the same partition with the next command
(block size:512 bytes = 0x200)
> gpt write mmc 0 name=test,start=0x4400,size=0x753F7A00
Writing GPT: Partitions layout exceds disk size
> gpt write mmc 0 name=test,start=0x4400,size=0x753F7800
Writing GPT: Partitions layout exceds disk size
> gpt write mmc 0 name=test,start=0x4400,size=0x753F7600
Writing GPT: success!
Partition Map for MMC device 0 -- Partition Type: EFI
Part Start LBA End LBA Name
Attributes
Type GUID
Partition GUID
1 0x00000022 0x003a9fdc "test"
attrs: 0x0000000000000000
type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
type: data
guid: 36ec30ef-7ca4-cd48-97cd-ea9fb95185d0
the max LBA when the size is indicated (0x003a9fdc) is lower than
when u-boot compute the max allowed value with size=0 (0x003a9fde)
in the code :
/* partition ending lba */
if ((i == parts - 1) && (partitions[i].size == 0))
/* extend the last partition to maximuim */
gpt_e[i].ending_lba = gpt_h->last_usable_lba;
else
gpt_e[i].ending_lba = cpu_to_le64(offset - 1);
so offset = gpt_h->last_usable_lba + 1 is acceptable !
but the test (offset >= last_usable_lba) cause the error
END
Signed-off-by: Patrick Delaunay <patrick.delaunay73 at gmail.com>disk: part_efi: fix check of the max partition size
the last value acceptable value for offset is (last_usable_lba + 1)
and not (last_usable_lba - 1)
issue found with SDCARD partition commands on u-boot 2015.10
but this part of code don't change
1- I create GPT partion on all the card (start and size undefined)
> gpt write mmc 0 name=test,start=0,size=0
> part list mmc 0
Partition Map for MMC device 0 -- Partition Type: EFI
Part Start LBA End LBA Name
Attributes
Type GUID
Partition GUID
1 0x00000022 0x003a9fde "test"
attrs: 0x0000000000000000
type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
type: data
guid: b710eb04-45b9-e94a-8d0b-21458d596f54
=> Start = 0x22*512 = 0x4400
=> Size = (0x003a9fde-0x22+1) * 512 = 0x753F7A00
2- I try to recreate the same partition with the command gpt write
and with start and size values (block size:512 bytes = 0x200)
> gpt write mmc 0 name=test,start=0x4400,size=0x753F7A00
Writing GPT: Partitions layout exceds disk size
> gpt write mmc 0 name=test,start=0x4400,size=0x753F7800
Writing GPT: Partitions layout exceds disk size
> gpt write mmc 0 name=test,start=0x4400,size=0x753F7600
Writing GPT: success!
I check the partition created :
> part list mmc 0
Partition Map for MMC device 0 -- Partition Type: EFI
Part Start LBA End LBA Name
Attributes
Type GUID
Partition GUID
1 0x00000022 0x003a9fdc "test"
attrs: 0x0000000000000000
type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
type: data
guid: 36ec30ef-7ca4-cd48-97cd-ea9fb95185d0
=> but the max LBA when the size is indicated (0x003a9fdc) is lower than
when u-boot compute the max allowed value with size=0 (0x003a9fde)
3- in the code, just after my patch, line 446
/* partition ending lba */
if ((i == parts - 1) && (partitions[i].size == 0))
/* extend the last partition to maximuim */
gpt_e[i].ending_lba = gpt_h->last_usable_lba;
else
gpt_e[i].ending_lba = cpu_to_le64(offset - 1);
so offset = gpt_h->last_usable_lba + 1 is acceptable !
(it the value used when size is 0)
but today the test (offset >= last_usable_lba) cause the error
my patch only solve this issue
END
Signed-off-by: Patrick Delaunay <patrick.delaunay73 at gmail.com>
---
disk/part_efi.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/disk/part_efi.c b/disk/part_efi.c
index fe308d7..0af1e92 100644
--- a/disk/part_efi.c
+++ b/disk/part_efi.c
@@ -439,7 +439,7 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
gpt_e[i].starting_lba = cpu_to_le64(offset);
offset += partitions[i].size;
}
- if (offset >= last_usable_lba) {
+ if (offset > (last_usable_lba + 1)) {
printf("Partitions layout exceds disk size\n");
return -1;
}
--
1.9.1
More information about the U-Boot
mailing list