Hi Quentin,

On 1/14/26 16:41, Quentin Schulz wrote:
> Hi Mikhail,
>
> On 1/6/26 6:14 AM, Mikhail Kshevetskiy wrote:
>> GPT disk partition with max available number (ex: /dev/mmcblk128) can't
>> be read/write from U-Boot using read/write command. Here is an example:
>>
>>    => mmc part
>>
>>    Partition Map for mmc device 0  --   Partition Type: EFI
>>
>>    Part    Start LBA    End LBA        Name
>>     Attributes
>>     Type GUID
>>     Partition GUID
>>    1    0x00001000    0x000013ff    "env1"
>>     attrs:    0x0000000000000000
>>     type:    0fc63daf-8483-4772-8e79-3d69d8477de4
>>     guid:    5452574f-2211-4433-5566-778899aabb02
>>    2    0x00001400    0x000017ff    "env2"
>>     attrs:    0x0000000000000000
>>     type:    0fc63daf-8483-4772-8e79-3d69d8477de4
>>     guid:    5452574f-2211-4433-5566-778899aabb03
>>    .................
>>    8    0x00158000    0x0034bfff    "apps"
>>     attrs:    0x0000000000000000
>>     type:    0fc63daf-8483-4772-8e79-3d69d8477de4
>>     guid:    5452574f-2211-4433-5566-778899aabb09
>>    128    0x00000420    0x00000fff    "fip"
>>     attrs:    0x0000000000000000
>>     type:    c12a7328-f81f-11d2-ba4b-00a0c93ec93b
>>     guid:    5452574f-2211-4433-5566-778899aabb01
>>
>>    => read mmc 0#fip ${loadaddr} 0 4
>>    Could not find "fip" partition
>>    ** Bad device specification mmc 0#fip **
>>    ** Bad device specification mmc 0#fip **
>>    Couldn't find partition mmc 0#fip
>>
>> The error is caused by invalid boundary checks. This patch fixes an
>> issue.
>>
>> Fixes: 43fd4bcefd4e ("disk: part: implement generic function
>> part_get_info_by_uuid()")
>> Fixes: 56670d6fb83f ("disk: part: use common api to lookup part driver")
>> Signed-off-by: Mikhail Kshevetskiy <[email protected]>
>> ---
>>   disk/part.c | 4 ++--
>>   1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/disk/part.c b/disk/part.c
>> index 49a0fca6b89..4923dc44593 100644
>> --- a/disk/part.c
>> +++ b/disk/part.c
>> @@ -674,7 +674,7 @@ int part_get_info_by_name(struct blk_desc *desc,
>> const char *name,
>>       if (!part_drv)
>>           return -1;
>>   -    for (i = 1; i < part_drv->max_entries; i++) {
>> +    for (i = 1; i <= part_drv->max_entries; i++) {
>>           ret = part_driver_get_info(part_drv, desc, i, info);
>>           if (ret != 0) {
>>               /* -ENOSYS means no ->get_info method. */
>> @@ -709,7 +709,7 @@ int part_get_info_by_uuid(struct blk_desc *desc,
>> const char *uuid,
>>       if (!part_drv)
>>           return -1;
>>   -    for (i = 1; i < part_drv->max_entries; i++) {
>> +    for (i = 1; i <= part_drv->max_entries; i++) {
>
> This *seems* to be fine but I'm wary of the change.
>
> Are we sure **all** partition drivers understood this the right way
> and did store the maximum number of entries in that variable? This
> could open the door to out-of-band access/buffer overflow if we have
> some arrays of size max_entries for example (thus accessible
> array[max_entries] is an out-of-band access for example).
>
> For example the AMIGA partition driver seems to be saying there can
> only be 8 partitions, while
> https://amitools.readthedocs.io/en/latest/tools/rdbtool.html#info-show-information-of-the-rdb-data-structures
> shows 9 partitions, starting at 0 instead of 1 even. We have
> max_entries set to AMIGA_ENTRY_NUMBERS (8) so I guess 1-7 is currently
> covered, but this would then cover 1-8 which hopefully is still fine
> (we would still be missing partition 0 if that one is actually possible).
>
> So we need careful consideration on the impact of this patch across
> all types of partitions. 


There is no upper limit in AMIGA partition layout. U-Boot
uses  AMIGA_ENTRY_NUMBERS just to restrict the number of available entries. 
I study this and other partition drivers and fix all found issues (see
my next patch series)

>
> Finally, I'm pretty sure we may need something similar in cmd/gpt.c
> since the same check is made there? 

Good catch! Fixed in my next patch series.
>
> Cheers,
> Quentin 


Regards,
Mikhail Kshevetskiy

Reply via email to