On Thu, Mar 07, 2019 at 08:52:45PM +0100, Klemens Nanni wrote:
> 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.
This is not right. Each started (or defined if in /etc/vm.conf) VM is assigned
an ID. That ID can be used in place of a name. That behaviour needs to continue
to work.
My advice is to just clean up the man page and error messages, nothing more.
-ml
>
> $ ./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
>