diff options
author | Blazej Kucman <blazej.kucman@intel.com> | 2021-12-03 15:31:15 +0100 |
---|---|---|
committer | Jes Sorensen <jsorensen@fb.com> | 2021-12-08 09:39:50 -0500 |
commit | ced5fa8b170ad448f4076e24a10c731b5cfb36ce (patch) | |
tree | 3d9bb069b988bb06da8445291076efcf31aebde6 | |
parent | b71de056cec70784ef2727e2febd7a6c88e580db (diff) | |
download | mdadm-ced5fa8b170ad448f4076e24a10c731b5cfb36ce.tar.gz |
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>
-rw-r--r-- | mdadm.8.in | 5 | ||||
-rw-r--r-- | mdadm.c | 9 | ||||
-rw-r--r-- | mdadm.h | 5 |
3 files changed, 18 insertions, 1 deletions
@@ -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%. @@ -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); @@ -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 |