diff options
author | Shawn Guo <shawn.guo@linaro.org> | 2017-11-02 16:46:34 +0800 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2017-11-06 09:59:01 -0500 |
commit | 8f7102cf6bf744cbd9bf0e7fd79a82aaea989f81 (patch) | |
tree | 31be5379d713cb573163015aa81727de635a3875 /disk | |
parent | bb021013ba1ea4f7ade55ed932ab9d807e8a09ea (diff) | |
download | u-boot-8f7102cf6bf744cbd9bf0e7fd79a82aaea989f81.tar.gz |
disk: part_dos: fix part_get_info_extended() function
The check in part_get_info_extended() for a successful partition
searching misses a condition for extended partition. In case of
(ext_part_sector == 0), we should anyway mark the partition as found,
even if it's an extended partition, i.e. (is_extended(pt->sys_ind) == 0).
Otherwise, the extended partition (type 0x0f) will never be identified,
and the following recursive call to part_get_info_extended() will get a
wrong 'part_num' and 'which_part' parameter. In the end, all those
partitions in extended table will not be identified.
Let's add the missing OR condition of (ext_part_sector == 0) for
is_extended() check to fix the problem.
The issue is discovered by running fastboot flash to an extended
partition on eMMC.
$ fastboot flash mmcsda5 cache.img
target reported max download size of 536870912 bytes
sending 'mmcsda5' (18796 KB)...
OKAY [ 2.144s]
writing 'mmcsda5'...
FAILED (remote: cannot find partition)
finished. total time: 2.261s
Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
Diffstat (limited to 'disk')
-rw-r--r-- | disk/part_dos.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/disk/part_dos.c b/disk/part_dos.c index 6dd2c2d147..046f9bbb3d 100644 --- a/disk/part_dos.c +++ b/disk/part_dos.c @@ -220,7 +220,7 @@ static int part_get_info_extended(struct blk_desc *dev_desc, if (((pt->boot_ind & ~0x80) == 0) && (pt->sys_ind != 0) && (part_num == which_part) && - (is_extended(pt->sys_ind) == 0)) { + (ext_part_sector == 0 || is_extended(pt->sys_ind) == 0)) { info->blksz = DOS_PART_DEFAULT_SECTOR; info->start = (lbaint_t)(ext_part_sector + le32_to_int(pt->start4)); |