mdadm: block creation with long names

This fixes buffer overflows in create_mddev(). It prohibits
creation with not supported names for DDF and native. For IMSM,
mdadm will do silent cut to 16 later.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
This commit is contained in:
Blazej Kucman 2021-12-03 15:31:15 +01:00 committed by Jes Sorensen
parent b71de056ce
commit ced5fa8b17
3 changed files with 18 additions and 1 deletions

View File

@ -2186,6 +2186,11 @@ is run, but will be created by
.I udev
once the array becomes active.
The max length md-device name is limited to 32 characters.
Different metadata types have more strict limitation
(like IMSM where only 16 characters are allowed).
For that reason, long name could be truncated or rejected, it depends on metadata policy.
As devices are added, they are checked to see if they contain RAID
superblocks or filesystems. They are also checked to see if the variance in
device size exceeds 1%.

View File

@ -1359,9 +1359,16 @@ int main(int argc, char *argv[])
mdfd = open_mddev(devlist->devname, 1);
if (mdfd < 0)
exit(1);
} else
} else {
char *bname = basename(devlist->devname);
if (strlen(bname) > MD_NAME_MAX) {
pr_err("Name %s is too long.\n", devlist->devname);
exit(1);
}
/* non-existent device is OK */
mdfd = open_mddev(devlist->devname, 0);
}
if (mdfd == -2) {
pr_err("device %s exists but is not an md array.\n", devlist->devname);
exit(1);

View File

@ -1880,3 +1880,8 @@ enum r0layout {
#define INVALID_SECTORS 1
/* And another special number needed for --data_offset=variable */
#define VARIABLE_OFFSET 3
/**
* This is true for native and DDF, IMSM allows 16.
*/
#define MD_NAME_MAX 32