diff --git a/cmd/zfs/zfs_main.c b/cmd/zfs/zfs_main.c index 3f54985b9..cea421238 100644 --- a/cmd/zfs/zfs_main.c +++ b/cmd/zfs/zfs_main.c @@ -649,6 +649,11 @@ zfs_do_clone(int argc, char **argv) if (ret == 0) { zfs_handle_t *clone; + if (log_history) { + (void) zpool_log_history(g_zfs, history_str); + log_history = B_FALSE; + } + clone = zfs_open(g_zfs, argv[1], ZFS_TYPE_DATASET); if (clone != NULL) { if (zfs_get_type(clone) != ZFS_TYPE_VOLUME) @@ -828,6 +833,11 @@ zfs_do_create(int argc, char **argv) if (zfs_create(g_zfs, argv[0], type, props) != 0) goto error; + if (log_history) { + (void) zpool_log_history(g_zfs, history_str); + log_history = B_FALSE; + } + if ((zhp = zfs_open(g_zfs, argv[0], ZFS_TYPE_DATASET)) == NULL) goto error; @@ -6481,11 +6491,12 @@ main(int argc, char **argv) usage(B_FALSE); ret = 1; } - libzfs_fini(g_zfs); if (ret == 0 && log_history) (void) zpool_log_history(g_zfs, history_str); + libzfs_fini(g_zfs); + /* * The 'ZFS_ABORT' environment variable causes us to dump core on exit * for the purposes of running ::findleaks. diff --git a/module/zfs/zfs_ioctl.c b/module/zfs/zfs_ioctl.c index bf212dee8..a061978dc 100644 --- a/module/zfs/zfs_ioctl.c +++ b/module/zfs/zfs_ioctl.c @@ -5558,9 +5558,9 @@ zfsdev_ioctl(struct file *filp, unsigned cmd, unsigned long arg) { zfs_cmd_t *zc; uint_t vecnum; - int error, rc, len, flag = 0; + int error, rc, len = 0, flag = 0; const zfs_ioc_vec_t *vec; - char *saved_poolname; + char *saved_poolname = NULL; nvlist_t *innvl = NULL; vecnum = cmd - ZFS_IOC_FIRST; @@ -5576,7 +5576,6 @@ zfsdev_ioctl(struct file *filp, unsigned cmd, unsigned long arg) return (-SET_ERROR(EINVAL)); zc = kmem_zalloc(sizeof (zfs_cmd_t), KM_SLEEP | KM_NODEBUG); - saved_poolname = kmem_alloc(MAXNAMELEN, KM_SLEEP); error = ddi_copyin((void *)arg, zc, sizeof (zfs_cmd_t), flag); if (error != 0) { @@ -5626,9 +5625,9 @@ zfsdev_ioctl(struct file *filp, unsigned cmd, unsigned long arg) goto out; /* legacy ioctls can modify zc_name */ - (void) strlcpy(saved_poolname, zc->zc_name, sizeof (saved_poolname)); - len = strcspn(saved_poolname, "/@") + 1; - saved_poolname[len] = '\0'; + len = strcspn(zc->zc_name, "/@#") + 1; + saved_poolname = kmem_alloc(len, KM_SLEEP); + (void) strlcpy(saved_poolname, zc->zc_name, len); if (vec->zvec_func != NULL) { nvlist_t *outnvl; @@ -5693,10 +5692,12 @@ out: char *s = tsd_get(zfs_allow_log_key); if (s != NULL) strfree(s); - (void) tsd_set(zfs_allow_log_key, strdup(saved_poolname)); + (void) tsd_set(zfs_allow_log_key, saved_poolname); + } else { + if (saved_poolname != NULL) + kmem_free(saved_poolname, len); } - kmem_free(saved_poolname, MAXNAMELEN); kmem_free(zc, sizeof (zfs_cmd_t)); return (-error); }