summaryrefslogtreecommitdiffstats
path: root/sys/cddl
diff options
context:
space:
mode:
authorsmh <smh@FreeBSD.org>2013-08-04 11:38:08 +0000
committersmh <smh@FreeBSD.org>2013-08-04 11:38:08 +0000
commitc2f521e2b9fbb3ea7c970d632ec70655a79c0970 (patch)
treef14d4f9de562972dd0dc1e05511d071b37a27a66 /sys/cddl
parent5d2437d56f280f49cf0e57f124f9ab98211ddb13 (diff)
downloadFreeBSD-src-c2f521e2b9fbb3ea7c970d632ec70655a79c0970.zip
FreeBSD-src-c2f521e2b9fbb3ea7c970d632ec70655a79c0970.tar.gz
zfs_ioc_rename should not leave the value of zc_name passed in via zc altered
on return. MFC after: 1 week
Diffstat (limited to 'sys/cddl')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
index 020d697..34358e6 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
@@ -3612,6 +3612,8 @@ zfs_ioc_rename(zfs_cmd_t *zc)
at = strchr(zc->zc_name, '@');
if (at != NULL) {
/* snaps must be in same fs */
+ int error;
+
if (strncmp(zc->zc_name, zc->zc_value, at - zc->zc_name + 1))
return (SET_ERROR(EXDEV));
*at = '\0';
@@ -3620,14 +3622,19 @@ zfs_ioc_rename(zfs_cmd_t *zc)
#else
if (zc->zc_objset_type == DMU_OST_ZFS && allow_mounted) {
#endif
- int error = dmu_objset_find(zc->zc_name,
+ error = dmu_objset_find(zc->zc_name,
recursive_unmount, at + 1,
recursive ? DS_FIND_CHILDREN : 0);
- if (error != 0)
+ if (error != 0) {
+ *at = '@';
return (error);
+ }
}
- return (dsl_dataset_rename_snapshot(zc->zc_name,
- at + 1, strchr(zc->zc_value, '@') + 1, recursive));
+ error = dsl_dataset_rename_snapshot(zc->zc_name,
+ at + 1, strchr(zc->zc_value, '@') + 1, recursive);
+ *at = '@';
+
+ return (error);
} else {
#ifdef illumos
if (zc->zc_objset_type == DMU_OST_ZVOL)
OpenPOWER on IntegriCloud