The branch main has been updated by kevans:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=dadb9c70938c4ae2c260f6af65752c67ac752284

commit dadb9c70938c4ae2c260f6af65752c67ac752284
Author:     Kyle Evans <kev...@freebsd.org>
AuthorDate: 2022-04-03 02:04:31 +0000
Commit:     Kyle Evans <kev...@freebsd.org>
CommitDate: 2022-04-03 02:04:31 +0000

    bectl: push space-in-name check down into libbe
    
    This check was previously in `create` only, not applying to renames.  It
    should really be applied at the libbe level, so that we can avoid
    writing about this restriction over and over again.
    
    While we're here: `bectl rename` always succeeds, even when it doesn't.
    Start returning the error.
    
    Reported By:    Christian McDonald <cmcdonald netgate com>
    Reviewed by:    rew, jwmaag_gmail.com (earlier version)
    Differential Revision:  https://reviews.freebsd.org/D34605
---
 lib/libbe/be.c     | 11 +++++++++++
 sbin/bectl/bectl.c |  9 ++-------
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/lib/libbe/be.c b/lib/libbe/be.c
index d6fe027f5df3..13f7a59d5215 100644
--- a/lib/libbe/be.c
+++ b/lib/libbe/be.c
@@ -961,6 +961,17 @@ be_validate_name(libbe_handle_t *lbh, const char *name)
        if (!zfs_name_valid(name, ZFS_TYPE_DATASET))
                return (BE_ERR_INVALIDNAME);
 
+       /*
+        * ZFS allows spaces in boot environment names, but the kernel can't
+        * handle booting from such a dataset right now.  vfs.root.mountfrom
+        * is defined to be a space-separated list, and there's no protocol for
+        * escaping whitespace in the path component of a dev:path spec.  So
+        * while loader can handle this situation alright, it can't safely pass
+        * it on to mountroot.
+        */
+       if (strchr(name, ' ') != NULL)
+               return (BE_ERR_INVALIDNAME);
+
        return (BE_ERR_SUCCESS);
 }
 
diff --git a/sbin/bectl/bectl.c b/sbin/bectl/bectl.c
index d3de58ea2982..2b7af4e55419 100644
--- a/sbin/bectl/bectl.c
+++ b/sbin/bectl/bectl.c
@@ -134,7 +134,6 @@ get_cmd_info(const char *cmd)
        return (NULL);
 }
 
-
 static int
 bectl_cmd_activate(int argc, char *argv[])
 {
@@ -233,10 +232,7 @@ bectl_cmd_create(int argc, char *argv[])
        bootenv = *argv;
 
        err = BE_ERR_SUCCESS;
-       if (strchr(bootenv, ' ') != NULL)
-               /* BE datasets with spaces are not bootable */
-               err = BE_ERR_INVALIDNAME;
-       else if ((atpos = strchr(bootenv, '@')) != NULL) {
+       if ((atpos = strchr(bootenv, '@')) != NULL) {
                /*
                 * This is the "create a snapshot variant". No new boot
                 * environment is to be created here.
@@ -478,7 +474,6 @@ bectl_cmd_rename(int argc, char *argv[])
        dest = argv[2];
 
        err = be_rename(be, src, dest);
-
        switch (err) {
        case BE_ERR_SUCCESS:
                break;
@@ -487,7 +482,7 @@ bectl_cmd_rename(int argc, char *argv[])
                    src, dest);
        }
 
-       return (0);
+       return (err);
 }
 
 static int

Reply via email to