Skip to content

Commit

Permalink
cmd: gpt: fix calc_parts_list_len()
Browse files Browse the repository at this point in the history
* 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: 2fcaa41 ("gpt: harden set_gpt_info() against non NULL-terminated strings")
Signed-off-by: Heinrich Schuchardt <[email protected]>
  • Loading branch information
xypron authored and trini committed Sep 11, 2023
1 parent 396f315 commit 69f4d37
Showing 1 changed file with 20 additions and 14 deletions.
34 changes: 20 additions & 14 deletions cmd/gpt.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit 69f4d37

Please sign in to comment.