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:
parent
b71de056ce
commit
ced5fa8b17
|
@ -2186,6 +2186,11 @@ is run, but will be created by
|
||||||
.I udev
|
.I udev
|
||||||
once the array becomes active.
|
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
|
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
|
superblocks or filesystems. They are also checked to see if the variance in
|
||||||
device size exceeds 1%.
|
device size exceeds 1%.
|
||||||
|
|
9
mdadm.c
9
mdadm.c
|
@ -1359,9 +1359,16 @@ int main(int argc, char *argv[])
|
||||||
mdfd = open_mddev(devlist->devname, 1);
|
mdfd = open_mddev(devlist->devname, 1);
|
||||||
if (mdfd < 0)
|
if (mdfd < 0)
|
||||||
exit(1);
|
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 */
|
/* non-existent device is OK */
|
||||||
mdfd = open_mddev(devlist->devname, 0);
|
mdfd = open_mddev(devlist->devname, 0);
|
||||||
|
}
|
||||||
if (mdfd == -2) {
|
if (mdfd == -2) {
|
||||||
pr_err("device %s exists but is not an md array.\n", devlist->devname);
|
pr_err("device %s exists but is not an md array.\n", devlist->devname);
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
5
mdadm.h
5
mdadm.h
|
@ -1880,3 +1880,8 @@ enum r0layout {
|
||||||
#define INVALID_SECTORS 1
|
#define INVALID_SECTORS 1
|
||||||
/* And another special number needed for --data_offset=variable */
|
/* And another special number needed for --data_offset=variable */
|
||||||
#define VARIABLE_OFFSET 3
|
#define VARIABLE_OFFSET 3
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is true for native and DDF, IMSM allows 16.
|
||||||
|
*/
|
||||||
|
#define MD_NAME_MAX 32
|
||||||
|
|
Loading…
Reference in New Issue