summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/zfs/dsl_dataset.c
diff options
context:
space:
mode:
authorJerry Jelinek <jerry.jelinek@joyent.com>2015-05-28 12:08:20 +0000
committerJerry Jelinek <jerry.jelinek@joyent.com>2015-05-28 12:08:20 +0000
commit875d2a359726f3c8cbb1d3aea07d338b78810b56 (patch)
tree78236213079c47c39e4034f67077db22bd4a6bcb /usr/src/uts/common/fs/zfs/dsl_dataset.c
parente69deeed01db5ab5784bcfe090f788f6bc6f574b (diff)
parent09f79f7c66b85f056db11f58210dc6182c9b1aef (diff)
downloadillumos-joyent-20150528.tar.gz
[illumos-gate merge]20150528release-20150528
commit 09f79f7c66b85f056db11f58210dc6182c9b1aef 4418 svc.startd crash with a long instance name and more than one dependency commit cb5842f8b0caaad0ed53535bd77042e933fdbafe 5909 ensure that shared snap names don't become too long after promotion commit beddaa9ce797b9deaafc22b4f156d23f9b45c32d 5870 dmu_recv_end_check() leaks origin_head hold if error happens in drc_force branch commit 5bae108fe2364722de3aa86e04966a0d33fd027a 5912 full stream can not be force-received into a dataset if it has a snapshot commit c701fde6911c957e71b37aac4daf672bd828f4d7 5961 Fix stack overflow in zfs_create_fs commit c423721f9bcd45c2409ef7b73fc103ac2889f9e9 5669 altroot not set in zpool create when specified with -o commit 5897eb49ccde82d19214b71984f57935e7e313d1 5438 zfs_blkptr_verify should continue after zfs_panic_recover
Diffstat (limited to 'usr/src/uts/common/fs/zfs/dsl_dataset.c')
-rw-r--r--usr/src/uts/common/fs/zfs/dsl_dataset.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/usr/src/uts/common/fs/zfs/dsl_dataset.c b/usr/src/uts/common/fs/zfs/dsl_dataset.c
index ef781cbce8..a11926b58f 100644
--- a/usr/src/uts/common/fs/zfs/dsl_dataset.c
+++ b/usr/src/uts/common/fs/zfs/dsl_dataset.c
@@ -2099,12 +2099,14 @@ dsl_dataset_promote_check(void *arg, dmu_tx_t *tx)
int err;
uint64_t unused;
uint64_t ss_mv_cnt;
+ size_t max_snap_len;
err = promote_hold(ddpa, dp, FTAG);
if (err != 0)
return (err);
hds = ddpa->ddpa_clone;
+ max_snap_len = MAXNAMELEN - strlen(ddpa->ddpa_clonename) - 1;
if (dsl_dataset_phys(hds)->ds_flags & DS_FLAG_NOPROMOTE) {
promote_rele(ddpa, FTAG);
@@ -2168,6 +2170,10 @@ dsl_dataset_promote_check(void *arg, dmu_tx_t *tx)
/* Check that the snapshot name does not conflict */
VERIFY0(dsl_dataset_get_snapname(ds));
+ if (strlen(ds->ds_snapname) >= max_snap_len) {
+ err = SET_ERROR(ENAMETOOLONG);
+ goto out;
+ }
err = dsl_dataset_snap_lookup(hds, ds->ds_snapname, &val);
if (err == 0) {
(void) strcpy(ddpa->err_ds, snap->ds->ds_snapname);