]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
cmd: gpt: fix calc_parts_list_len()
authorHeinrich Schuchardt <heinrich.schuchardt@canonical.com>
Sat, 2 Sep 2023 07:35:23 +0000 (09:35 +0200)
committerTom Rini <trini@konsulko.com>
Mon, 11 Sep 2023 20:31:25 +0000 (16:31 -0400)
* Avoid incrementing by moving comma into strlen("uuid_disk=,") and
  considering NUL byte.
* Appending a UUID only adds UUID_STR_LEN bytes.
  Don't count the terminating NUL.
* The length of the hexadecimal representation of lba_int is
  2 * sizeof(lba_int).
* We don't use a 'MiB' postfix but a '0x' prefix.
* The uuid field is only needed if configured.

Fixes: 2fcaa413b3f6 ("gpt: harden set_gpt_info() against non NULL-terminated strings")
Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
cmd/gpt.c

index 96cd8efaafb81c14c117f64e26b25bffec7d217f..c404785c1d1861c6f762eb42e0f0654ed77e28bc 100644 (file)
--- a/cmd/gpt.c
+++ b/cmd/gpt.c
@@ -162,26 +162,32 @@ static bool found_key(const char *str, const char *key)
        return result;
 }
 
+/**
+ * calc_parts_list_len() - get size of partition table description
+ *
+ * @numparts:  number of partitions
+ * Return:     string size including terminating NUL
+ */
 static int calc_parts_list_len(int numparts)
 {
-       int partlistlen = UUID_STR_LEN + 1 + strlen("uuid_disk=");
-       /* for the comma */
-       partlistlen++;
-
-       /* per-partition additions; numparts starts at 1, so this should be correct */
-       partlistlen += numparts * (strlen("name=,") + PART_NAME_LEN + 1);
+       /* number of hexadecimal digits of the lbaint_t representation */
+       const int lbaint_size = 2 * sizeof(lbaint_t);
+       int partlistlen;
+
+       /* media description including terminating NUL */
+       partlistlen = strlen("uuid_disk=;") + UUID_STR_LEN + 1;
+       /* per-partition descriptions; numparts */
+       partlistlen += numparts * (strlen("name=,") + PART_NAME_LEN);
        /* see part.h for definition of struct disk_partition */
-       partlistlen += numparts * (strlen("start=MiB,") + sizeof(lbaint_t) + 1);
-       partlistlen += numparts * (strlen("size=MiB,") + sizeof(lbaint_t) + 1);
+       partlistlen += numparts * (strlen("start=0x,") + lbaint_size);
+       partlistlen += numparts * (strlen("size=0x,") + lbaint_size);
 #ifdef CONFIG_PARTITION_TYPE_GUID
        partlistlen += numparts * (strlen("type=,") + UUID_STR_LEN + 1);
 #endif
-       partlistlen += numparts * strlen("bootable,");
-       partlistlen += numparts * (strlen("uuid=;") + UUID_STR_LEN + 1);
-       /* for the terminating null */
-       partlistlen++;
-       debug("Length of partitions_list is %d for %d partitions\n", partlistlen,
-             numparts);
+       if (IS_ENABLED(CONFIG_PARTITION_UUIDS))
+               partlistlen += numparts * (strlen("uuid=;") + UUID_STR_LEN);
+       debug("Length of partitions_list is %d for %d partitions\n",
+             partlistlen, numparts);
        return partlistlen;
 }