summaryrefslogtreecommitdiff
path: root/lib/libbe
diff options
context:
space:
mode:
authorKyle Evans <kevans@FreeBSD.org>2019-04-10 14:00:03 +0000
committerKyle Evans <kevans@FreeBSD.org>2019-04-10 14:00:03 +0000
commitfcb47c42eccf2129127688cb99994ad9f1f8c0a0 (patch)
treeafb5dc90590a5ce88b431eb420c2ff4f8ac43e47 /lib/libbe
parent93a07b2278f58fdb800fbd5880c8372b826ffed9 (diff)
downloadsrc-test-fcb47c42eccf2129127688cb99994ad9f1f8c0a0.tar.gz
src-test-fcb47c42eccf2129127688cb99994ad9f1f8c0a0.zip
libbe(3): use libzfs name validation for datasets/snapshot names
Our home-rolled solution didn't quite capture all of the details, and we didn't actually validate snapshot names at all. zfs_name_valid captures the important details, but it doesn't necessarily expose the errors that we're wanting to see in the be_validate_* functions. Validating lengths independently, then the names, should make this a non-issue.
Notes
Notes: svn path=/head/; revision=346082
Diffstat (limited to 'lib/libbe')
-rw-r--r--lib/libbe/be.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/lib/libbe/be.c b/lib/libbe/be.c
index f6319064ad397..93cee26404245 100644
--- a/lib/libbe/be.c
+++ b/lib/libbe/be.c
@@ -593,6 +593,9 @@ be_validate_snap(libbe_handle_t *lbh, const char *snap_name)
if (strlen(snap_name) >= BE_MAXPATHLEN)
return (BE_ERR_PATHLEN);
+ if (!zfs_name_valid(snap_name, ZFS_TYPE_SNAPSHOT))
+ return (BE_ERR_INVALIDNAME);
+
if (!zfs_dataset_exists(lbh->lzh, snap_name,
ZFS_TYPE_SNAPSHOT))
return (BE_ERR_NOENT);
@@ -646,12 +649,6 @@ be_root_concat(libbe_handle_t *lbh, const char *name, char *result)
int
be_validate_name(libbe_handle_t *lbh, const char *name)
{
- for (int i = 0; *name; i++) {
- char c = *(name++);
- if (isalnum(c) || (c == '-') || (c == '_') || (c == '.'))
- continue;
- return (BE_ERR_INVALIDNAME);
- }
/*
* Impose the additional restriction that the entire dataset name must
@@ -659,6 +656,10 @@ be_validate_name(libbe_handle_t *lbh, const char *name)
*/
if (strlen(lbh->root) + 1 + strlen(name) > MAXNAMELEN)
return (BE_ERR_PATHLEN);
+
+ if (!zfs_name_valid(name, ZFS_TYPE_DATASET))
+ return (BE_ERR_INVALIDNAME);
+
return (BE_ERR_SUCCESS);
}