vmd(8) does not support numerical names with `start' and `receive'.
It never worked, the manuals are now clearer about this, but error
handling can still be improved:

        $ vmctl start 60 -t test -d 60.qcow2
        vmctl: start vm command failed: No such file or directory

That's from vm_start_complete() in vmctl.c:254 where vmd(8) unexpectedly
returns EPERM after it failed to create the VM.

        $ vmctl receive 60 </dev/null
        vmctl: invalid vm name
        vmctl: invalid id: 60

Here, first parse_vmid(), then it's caller ctl_receive() complains.

parse_vmid()'s last argument is `needname', indicating that the id to be
parsed must not be numerical.

The following diff makes the code check for a letter in the beginning,
adjusts `start' and `receive' set this argument and print only one error.

        $ ./obj/vmctl start 60 -t test -d 60.qcow2
        vmctl: invalid VM name
        $ ./obj/vmctl receive 60 </dev/null
        vmctl: invalid VM name

"vm" -> "VM" for consistency with all other "invalid VM name" occurences
throughout the sources.

Feedback? OK?

Index: usr.sbin/vmctl/main.c
===================================================================
RCS file: /cvs/src/usr.sbin/vmctl/main.c,v
retrieving revision 1.54
diff -u -p -r1.54 main.c
--- usr.sbin/vmctl/main.c       1 Mar 2019 12:47:36 -0000       1.54
+++ usr.sbin/vmctl/main.c       7 Mar 2019 19:14:15 -0000
@@ -524,7 +524,7 @@ parse_vmid(struct parse_result *res, cha
        id = strtonum(word, 0, UINT32_MAX, &error);
        if (error == NULL) {
                if (needname) {
-                       warnx("invalid vm name");
+                       warnx("invalid VM name");
                        return (-1);
                } else {
                        res->id = id;
@@ -842,8 +842,8 @@ ctl_start(struct parse_result *res, int 
        if (argc < 2)
                ctl_usage(res->ctl);
 
-       if (parse_vmid(res, argv[1], 0) == -1)
-               errx(1, "invalid id: %s", argv[1]);
+       if (parse_vmid(res, argv[1], 1) == -1)
+               exit(1);
 
        argc--;
        argv++;
@@ -1046,7 +1046,7 @@ ctl_receive(struct parse_result *res, in
                err(1, "pledge");
        if (argc == 2) {
                if (parse_vmid(res, argv[1], 1) == -1)
-                       errx(1, "invalid id: %s", argv[1]);
+                       exit(1);
        } else if (argc != 2)
                ctl_usage(res->ctl);
 
Index: usr.sbin/vmctl/vmctl.c
===================================================================
RCS file: /cvs/src/usr.sbin/vmctl/vmctl.c,v
retrieving revision 1.65
diff -u -p -r1.65 vmctl.c
--- usr.sbin/vmctl/vmctl.c      6 Dec 2018 09:23:15 -0000       1.65
+++ usr.sbin/vmctl/vmctl.c      7 Mar 2019 19:14:15 -0000
@@ -154,12 +154,7 @@ vm_start(uint32_t start_id, const char *
                }
        }
        if (name != NULL) {
-               /*
-                * Allow VMs names with alphanumeric characters, dot, hyphen
-                * and underscore. But disallow dot, hyphen and underscore at
-                * the start.
-                */
-               if (*name == '-' || *name == '.' || *name == '_')
+               if (!isalpha(*name))
                        errx(1, "invalid VM name");
 
                for (s = name; *s != '\0'; ++s) {
Index: usr.sbin/vmd/vmd.c
===================================================================
RCS file: /cvs/src/usr.sbin/vmd/vmd.c,v
retrieving revision 1.108
diff -u -p -r1.108 vmd.c
--- usr.sbin/vmd/vmd.c  9 Dec 2018 12:26:38 -0000       1.108
+++ usr.sbin/vmd/vmd.c  7 Mar 2019 19:14:15 -0000
@@ -1257,11 +1257,7 @@ vm_register(struct privsep *ps, struct v
            vcp->vcp_ndisks == 0 && strlen(vcp->vcp_cdrom) == 0) {
                log_warnx("no kernel or disk/cdrom specified");
                goto fail;
-       } else if (strlen(vcp->vcp_name) == 0) {
-               log_warnx("invalid VM name");
-               goto fail;
-       } else if (*vcp->vcp_name == '-' || *vcp->vcp_name == '.' ||
-           *vcp->vcp_name == '_') {
+       } else if (strlen(vcp->vcp_name) == 0 || !isalpha(*vcp->vcp_name)) {
                log_warnx("invalid VM name");
                goto fail;
        } else {
===================================================================
Stats: --- 15 lines 531 chars
Stats: +++ 6 lines 185 chars
Stats: -9 lines
Stats: -346 chars

Reply via email to