Преглед изворни кода

gpt: fix partion size limit

Currently, in gpt command, partion size is converted from string
to unsigned long type using 'ustrtol' function. That type limits
the partition size to 4GB.

This patch changes the conversion function to 'ustrtoll' to return
unsigned long long type.

Signed-off-by: Piotr Wilczek <p.wilczek@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Piotr Wilczek пре 12 година
родитељ
комит
3e34cf7bff
1 измењених фајлова са 6 додато и 4 уклоњено
  1. 6 4
      common/cmd_gpt.c

+ 6 - 4
common/cmd_gpt.c

@@ -27,6 +27,7 @@
 #include <part_efi.h>
 #include <part_efi.h>
 #include <exports.h>
 #include <exports.h>
 #include <linux/ctype.h>
 #include <linux/ctype.h>
+#include <div64.h>
 
 
 #ifndef CONFIG_PARTITION_UUIDS
 #ifndef CONFIG_PARTITION_UUIDS
 #error CONFIG_PARTITION_UUIDS must be enabled for CONFIG_CMD_GPT to be enabled
 #error CONFIG_PARTITION_UUIDS must be enabled for CONFIG_CMD_GPT to be enabled
@@ -131,6 +132,7 @@ static int set_gpt_info(block_dev_desc_t *dev_desc,
 	int p_count;
 	int p_count;
 	disk_partition_t *parts;
 	disk_partition_t *parts;
 	int errno = 0;
 	int errno = 0;
+	uint64_t size_ll, start_ll;
 
 
 	debug("%s: MMC lba num: 0x%x %d\n", __func__,
 	debug("%s: MMC lba num: 0x%x %d\n", __func__,
 	      (unsigned int)dev_desc->lba, (unsigned int)dev_desc->lba);
 	      (unsigned int)dev_desc->lba, (unsigned int)dev_desc->lba);
@@ -217,8 +219,8 @@ static int set_gpt_info(block_dev_desc_t *dev_desc,
 		}
 		}
 		if (extract_env(val, &p))
 		if (extract_env(val, &p))
 			p = val;
 			p = val;
-		parts[i].size = ustrtoul(p, &p, 0);
-		parts[i].size /= dev_desc->blksz;
+		size_ll = ustrtoull(p, &p, 0);
+		parts[i].size = lldiv(size_ll, dev_desc->blksz);
 		free(val);
 		free(val);
 
 
 		/* start address */
 		/* start address */
@@ -226,8 +228,8 @@ static int set_gpt_info(block_dev_desc_t *dev_desc,
 		if (val) { /* start address is optional */
 		if (val) { /* start address is optional */
 			if (extract_env(val, &p))
 			if (extract_env(val, &p))
 				p = val;
 				p = val;
-			parts[i].start = ustrtoul(p, &p, 0);
-			parts[i].start /= dev_desc->blksz;
+			start_ll = ustrtoull(p, &p, 0);
+			parts[i].start = lldiv(start_ll, dev_desc->blksz);
 			free(val);
 			free(val);
 		}
 		}
 	}
 	}