summaryrefslogtreecommitdiffstats
path: root/cddl/contrib
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2018-04-16 03:44:13 +0000
committermav <mav@FreeBSD.org>2018-04-16 03:44:13 +0000
commitf78b79c53523a40e765615d4fc3ac3ba4b106b5e (patch)
treed7cc3678bc2f1db0f5de8a05d62e6cb32a958a79 /cddl/contrib
parent2b122f114206b439112b31d230050c5ef5907d84 (diff)
downloadFreeBSD-src-f78b79c53523a40e765615d4fc3ac3ba4b106b5e.zip
FreeBSD-src-f78b79c53523a40e765615d4fc3ac3ba4b106b5e.tar.gz
MFC r329783: 8942 zfs promote .../%recv should be an error
illumos/illumos-gate@add927f8c8d101e16c23eb9cd270be4fd7edf7d5 Reported on the ZFSonLinux https://github.com/zfsonlinux/zfs/issues/4843, fixed by https://github.com/zfsonlinux/zfs/pull/6339: If we are in the middle of an incremental zfs receive, the child .../%recv will exist. If you concurrently run zfs promote .../%recv, it will "work", but then zfs gets confused. For example, there's no obvious way to destroy the containing filesystem (because it is now a clone of its invisible child). Attempting to do this promote should be an error. We could fix this by having zfs_ioc_promote() check if zc_name contains a %, similar to zfs_ioc_rename(). Reviewed by: Paul Dagnelie <pcd@delphix.com> Reviewed by: Matthew Ahrens <mahrens@delphix.com> Approved by: Dan McDonald <danmcd@joyent.com> Author: loli10K <ezomori.nozomu@gmail.com>
Diffstat (limited to 'cddl/contrib')
-rw-r--r--cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
index 0b51e1cc..fad1c05 100644
--- a/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
+++ b/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
@@ -3786,6 +3786,9 @@ zfs_promote(zfs_handle_t *zhp)
return (zfs_error(hdl, EZFS_BADTYPE, errbuf));
}
+ if (!zfs_validate_name(hdl, zhp->zfs_name, zhp->zfs_type, B_TRUE))
+ return (zfs_error(hdl, EZFS_INVALIDNAME, errbuf));
+
ret = lzc_promote(zhp->zfs_name, snapname, sizeof (snapname));
if (ret != 0) {
@@ -4156,6 +4159,10 @@ zfs_rename(zfs_handle_t *zhp, const char *source, const char *target,
zhp->zfs_type = ZFS_TYPE_SNAPSHOT;
}
+ /* make sure source name is valid */
+ if (!zfs_validate_name(hdl, zhp->zfs_name, zhp->zfs_type, B_TRUE))
+ return (zfs_error(hdl, EZFS_INVALIDNAME, errbuf));
+
/*
* Make sure the target name is valid
*/
OpenPOWER on IntegriCloud