From aecfa9234dc6d3f6e56d2039b1c7d1c90e11832d Mon Sep 17 00:00:00 2001 From: Ned Bass Date: Wed, 7 Nov 2012 12:46:13 -0800 Subject: [PATCH] LU-2164 utils: mkfs.lustre segfaults if no "/" in dataset name 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 Change-Id: Ic7bede9ca19d646f64d2f166f189fa6822a70fe3 Reviewed-on: http://review.whamcloud.com/4490 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Alex Zhuravlev Reviewed-by: Andreas Dilger --- lustre/utils/mount_utils_zfs.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lustre/utils/mount_utils_zfs.c b/lustre/utils/mount_utils_zfs.c index 96f67fc..e9753b5 100644 --- a/lustre/utils/mount_utils_zfs.c +++ b/lustre/utils/mount_utils_zfs.c @@ -441,7 +441,7 @@ int zfs_make_lustre(struct mkfs_opts *mop) goto out; } - /* 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 */ @@ -536,18 +536,22 @@ int zfs_prepare_lustre(struct mkfs_opts *mop, char *default_mountopts, int default_len, char *always_mountopts, int always_len) { - int ret; - 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; } + if (strchr(mop->mo_device, '/') == NULL) { + fatal(); + fprintf(stderr, "Missing pool in filesystem name %s\n", + mop->mo_device); + return EINVAL; + } + return 0; } -- 1.8.3.1