Author: mav
Date: Thu Feb 22 01:42:13 2018
New Revision: 329783
URL: https://svnweb.freebsd.org/changeset/base/329783

Log:
  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 <[email protected]>
  Reviewed by: Matthew Ahrens <[email protected]>
  Approved by: Dan McDonald <[email protected]>
  Author: loli10K <[email protected]>

Modified:
  head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
Directory Properties:
  head/cddl/contrib/opensolaris/   (props changed)
  head/cddl/contrib/opensolaris/lib/libzfs/   (props changed)
  head/sys/cddl/contrib/opensolaris/   (props changed)

Modified: head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c    Thu Feb 
22 01:31:05 2018        (r329782)
+++ head/cddl/contrib/opensolaris/lib/libzfs/common/libzfs_dataset.c    Thu Feb 
22 01:42:13 2018        (r329783)
@@ -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) {
@@ -4155,6 +4158,10 @@ zfs_rename(zfs_handle_t *zhp, const char *source, cons
                (void) strlcat(zhp->zfs_name, source, sizeof(zhp->zfs_name));
                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

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c     Thu Feb 
22 01:31:05 2018        (r329782)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c     Thu Feb 
22 01:42:13 2018        (r329783)
@@ -3942,9 +3942,12 @@ zfs_ioc_rename(zfs_cmd_t *zc)
        allow_mounted = (zc->zc_cookie & 2) != 0;
 #endif
 
+       /* "zfs rename" from and to ...%recv datasets should both fail */
+       zc->zc_name[sizeof (zc->zc_name) - 1] = '\0';
        zc->zc_value[sizeof (zc->zc_value) - 1] = '\0';
-       if (dataset_namecheck(zc->zc_value, NULL, NULL) != 0 ||
-           strchr(zc->zc_value, '%'))
+       if (dataset_namecheck(zc->zc_name, NULL, NULL) != 0 ||
+           dataset_namecheck(zc->zc_value, NULL, NULL) != 0 ||
+           strchr(zc->zc_name, '%') || strchr(zc->zc_value, '%'))
                return (SET_ERROR(EINVAL));
 
        at = strchr(zc->zc_name, '@');
@@ -4995,6 +4998,11 @@ zfs_ioc_promote(zfs_cmd_t *zc)
        char origin[ZFS_MAX_DATASET_NAME_LEN];
        char *cp;
        int error;
+
+       zc->zc_name[sizeof (zc->zc_name) - 1] = '\0';
+       if (dataset_namecheck(zc->zc_name, NULL, NULL) != 0 ||
+           strchr(zc->zc_name, '%'))
+               return (SET_ERROR(EINVAL));
 
        error = dsl_pool_hold(zc->zc_name, FTAG, &dp);
        if (error != 0)
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to