mkfs.lustre incorrectly assumes that the libzfs function
zfs_name_valid() disallows filesystem names without a "/", and so uses
the result of strrchr(pool, '/') without a NULL check. In fact
dataset names without a / are permitted, as in the case of commands
like
zfs get all tank
where a pool tank is treated like a dataset. The leads to a segfault
if mkfs.lustre is given a dataset name without a /. Since lustre
datasets are always created as children of a pool, add a separate
check for a missing slash and print an error if it's missing.
Signed-off-by: Ned Bass <bass6@llnl.gov>
Change-Id: Ic7bede9ca19d646f64d2f166f189fa6822a70fe3
Reviewed-on: http://review.whamcloud.com/4490
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
- /* Due to zfs_name_valid() check the '/' must exist */
+ /* Due to zfs_prepare_lustre() check the '/' must exist */
strchr(pool, '/')[0] = '\0';
/* If --reformat was given attempt to destroy the previous dataset */
strchr(pool, '/')[0] = '\0';
/* If --reformat was given attempt to destroy the previous dataset */
char *default_mountopts, int default_len,
char *always_mountopts, int always_len)
{
char *default_mountopts, int default_len,
char *always_mountopts, int always_len)
{
if (osd_check_zfs_setup() == 0)
return EINVAL;
if (osd_check_zfs_setup() == 0)
return EINVAL;
- ret = zfs_name_valid(mop->mo_device, ZFS_TYPE_FILESYSTEM);
- if (!ret) {
+ if (zfs_name_valid(mop->mo_device, ZFS_TYPE_FILESYSTEM) == 0) {
fatal();
fprintf(stderr, "Invalid filesystem name %s\n", mop->mo_device);
return EINVAL;
}
fatal();
fprintf(stderr, "Invalid filesystem name %s\n", mop->mo_device);
return EINVAL;
}
+ if (strchr(mop->mo_device, '/') == NULL) {
+ fatal();
+ fprintf(stderr, "Missing pool in filesystem name %s\n",
+ mop->mo_device);
+ return EINVAL;
+ }
+