From: Dave Voutila Subject: Re: vmd(8): Fix no kernel or disk error To: Jan Klemkow Cc: tech@openbsd.org Date: Sat, 19 Sep 2026 10:06:13 -0400 Jan Klemkow writes: > Hi, > > If you try to start vmd(8) with the follwiing vm.conf: > > vm "vm1" { > disable > boot "/bsd.rd" > } > > you will run into the "no kernel or disk/cdrom specified" error. > If your start an anonymous vm via > > # vmctl start -b /bsd.rd vm2 > > It works fine. > > The configuration parser sets vmc->vmc_kernel to -1 and the flag > VMOP_CREATE_KERNEL. The file is opens after vm_register(). In case of > "vmctl start -b" the file is already opened before vm_register(). > > But, the flag VMOP_CREATE_KERNEL was set in both cases before vm_register(). > Thus, we should check for the flag and not for the filedescriptor in this case. > While here fix a wrong indentation, too. > > ok? looks good, ok dv@. > > bye, > Jan > > diff --git a/usr.sbin/vmd/vmd.c b/usr.sbin/vmd/vmd.c > index b4741dc74fc..cb9925496aa 100644 > --- a/usr.sbin/vmd/vmd.c > +++ b/usr.sbin/vmd/vmd.c > @@ -1212,8 +1212,8 @@ vm_register(struct privsep *ps, struct vmop_create_params *vmc, > } else if (vmc->vmc_nnics > VM_MAX_NICS_PER_VM) { > log_warnx("invalid number of interfaces"); > goto fail; > - } else if (vmc->vmc_kernel == -1 && vmc->vmc_ndisks == 0 > - && strlen(vmc->vmc_cdrom) == 0) { > + } else if ((vmc->vmc_flags & VMOP_CREATE_KERNEL) == 0 && > + vmc->vmc_ndisks == 0 && strlen(vmc->vmc_cdrom) == 0) { > log_warnx("no kernel or disk/cdrom specified"); > goto fail; > } else if (strlen(vmc->vmc_name) == 0) { > @@ -1416,7 +1416,7 @@ vm_instance(struct privsep *ps, struct vmd_vm **vm_parent, > > /* kernel */ > if (vmc->vmc_kernel > -1 || ((*vm_parent)->vm_kernel_path != NULL && > - strnlen((*vm_parent)->vm_kernel_path, PATH_MAX) < PATH_MAX)) { > + strnlen((*vm_parent)->vm_kernel_path, PATH_MAX) < PATH_MAX)) { > if (vm_checkinsflag(vmc_parent, VMOP_CREATE_KERNEL, uid) != 0) { > log_warnx("vm \"%s\" no permission to set boot image", > name);