Mercurial > illumos > illumos-gate
diff usr/src/uts/common/fs/zfs/dsl_dataset.c @ 4569:e80d40447f27
6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
author | mmusante |
---|---|
date | Fri, 29 Jun 2007 11:14:08 -0700 |
parents | 12bb2876a62e |
children | ed36b0e652bc |
line wrap: on
line diff
--- a/usr/src/uts/common/fs/zfs/dsl_dataset.c Fri Jun 29 11:12:38 2007 -0700 +++ b/usr/src/uts/common/fs/zfs/dsl_dataset.c Fri Jun 29 11:14:08 2007 -0700 @@ -1715,6 +1715,17 @@ return (err); } +static int +dsl_valid_rename(char *oldname, void *arg) +{ + int delta = *(int *)arg; + + if (strlen(oldname) + delta >= MAXNAMELEN) + return (ENAMETOOLONG); + + return (0); +} + #pragma weak dmu_objset_rename = dsl_dataset_rename int dsl_dataset_rename(char *oldname, const char *newname, @@ -1729,7 +1740,15 @@ if (err) return (err); if (tail == NULL) { - err = dsl_dir_rename(dd, newname); + int delta = strlen(newname) - strlen(oldname); + + /* if we're growing, validate child size lengths */ + if (delta > 0) + err = dmu_objset_find(oldname, dsl_valid_rename, + &delta, DS_FIND_CHILDREN | DS_FIND_SNAPSHOTS); + + if (!err) + err = dsl_dir_rename(dd, newname); dsl_dir_close(dd, FTAG); return (err); }