disk: part_dos: fix part_get_info_extended() function

Message ID 1509612394-24359-1-git-send-email-shawnguo@kernel.org
State New
Headers show
Series
  • disk: part_dos: fix part_get_info_extended() function
Related show

Commit Message

Shawn Guo Nov. 2, 2017, 8:46 a.m.
From: Shawn Guo <shawn.guo@linaro.org>

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>
---
 disk/part_dos.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Tom Rini Nov. 6, 2017, 11:28 p.m. | #1
On Thu, Nov 02, 2017 at 04:46:34PM +0800, Shawn Guo wrote:

> From: Shawn Guo <shawn.guo@linaro.org>

> 

> 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>


Applied to u-boot/master, thanks!

-- 
Tom

Patch

diff --git a/disk/part_dos.c b/disk/part_dos.c
index 1a36be0446ac..4485eb704852 100644
--- a/disk/part_dos.c
+++ b/disk/part_dos.c
@@ -210,7 +210,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));