summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authormmusante <none@none>2007-05-08 07:24:48 -0700
committermmusante <none@none>2007-05-08 07:24:48 -0700
commitf0c5ee210eebf913b19e8715470ed4fe669425a4 (patch)
tree03737acf181a61a69bdf3131732355603241d40a /usr/src
parent01802382148f6aee54021cc0fe7dffb760588b6f (diff)
downloadillumos-gate-f0c5ee210eebf913b19e8715470ed4fe669425a4.tar.gz
6550857 recursive rename leaks memory and segfaults on failure
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/lib/libzfs/common/libzfs_dataset.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/usr/src/lib/libzfs/common/libzfs_dataset.c b/usr/src/lib/libzfs/common/libzfs_dataset.c
index 6ea86a50d4..131007a5bd 100644
--- a/usr/src/lib/libzfs/common/libzfs_dataset.c
+++ b/usr/src/lib/libzfs/common/libzfs_dataset.c
@@ -3344,17 +3344,22 @@ zfs_rename(zfs_handle_t *zhp, const char *target, int recursive)
if (recursive) {
struct destroydata dd;
- parentname = strdup(zhp->zfs_name);
+ parentname = zfs_strdup(zhp->zfs_hdl, zhp->zfs_name);
+ if (parentname == NULL) {
+ ret = -1;
+ goto error;
+ }
delim = strchr(parentname, '@');
*delim = '\0';
zhrp = zfs_open(zhp->zfs_hdl, parentname, ZFS_TYPE_ANY);
if (zhrp == NULL) {
- return (-1);
+ ret = -1;
+ goto error;
}
dd.snapname = delim + 1;
dd.gotone = B_FALSE;
- dd.closezhp = B_FALSE;
+ dd.closezhp = B_TRUE;
/* We remove any zvol links prior to renaming them */
ret = zfs_iter_filesystems(zhrp, zfs_remove_link_cb, &dd);