On Sun, Mar 14, 2021 at 12:50:52AM +0000, James Cook wrote: > > >> > > >> I believe the correct fix here is to unveil the base image in the > > >> virtio_qcow2_get_base function in vioqcow2.c and not move around all the > > >> unveil calls like you're doing. There's no reason to postpone them. > > >> > > >> I think virtio_qcow2_get_base is only used by vmctl (haven't confirmed) > > >> but if so it should be safe to add the unveil call there. I did a quick > > >> 1-line change and checked that it at least resolves the error you're > > >> reporting. > > > > > > virtio_qcow2_get_base is also called by virtio_get_base in > > > usr.sbin/vmd/virtio.c. Maybe add an "unveil" flag as an additional > > > input to virtio_qcow2_get_base? > > > > > > > Good catch. Can you try the diff at the end of this email? > > > > I've split virtio_qcow2_get_base into 2 functions: > > - the base image extraction > > - resolving the path to the base image > > > > I've updated vmd(8) and vmctl(8) accordingly. This allows vmctl to > > properly unveil the base image without having to introduce unveil(2) > > calls in vmd(8) where there are none currently. > > It does not work if you change directories: > > > vmctl create -s 10m base.qcow2 > vmctl create -b base.qcow2 source.qcow2 > mkdir d > cd d > vmctl create -i ../source.qcow2 dest.qcow2 > > > the last command gives: > > unable to resolve base.qcow2 > vmctl: failed to open source image file > > > I think the problem is that the call to unveil in open_imagefile is > unveiling the wrong path --- it should be unveiling ../base.qcow2 but > it is unveiling base.qcow2. > > My original patch works with the above example. I imagine it would also > work to (a) optionally call unveil from vioqcow2.c or (b) split that > function at a slightly different place --- after the snprintf(..., > "%s/%s, ...) but before calling realpath. > > -- > James
Another thought --- is it necessary to call realpath at all? -- James