Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 Apr 2019 14:00:03 +0000 (UTC)
From:      Kyle Evans <kevans@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r346082 - head/lib/libbe
Message-ID:  <201904101400.x3AE03kM038965@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kevans
Date: Wed Apr 10 14:00:03 2019
New Revision: 346082
URL: https://svnweb.freebsd.org/changeset/base/346082

Log:
  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.

Modified:
  head/lib/libbe/be.c

Modified: head/lib/libbe/be.c
==============================================================================
--- head/lib/libbe/be.c	Wed Apr 10 13:42:37 2019	(r346081)
+++ head/lib/libbe/be.c	Wed Apr 10 14:00:03 2019	(r346082)
@@ -593,6 +593,9 @@ be_validate_snap(libbe_handle_t *lbh, const char *snap
 	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, 
 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);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201904101400.x3AE03kM038965>