qemu: fd: Fix monitor usage of qemuFDPassDirectGetPath

We need to use the 'name' variable and just overwrite it with the FD
number when FDs are passed on the monitor. Otherwise we will read NULL
path if the FD is accessed before being passed on the monitor. The idea
of this helper is to simplify the monitor code so it would be
counterproductive to have other behaviour.

Fixes the following symptom:

 $ virsh attach-interface cd network default --model virtio
 error: Failed to attach interface
 error: internal error: unable to execute QEMU command 'netdev_add': File descriptor named '(null)' has not been found

Fixes: bca9047906
Resolves: https://gitlab.com/libvirt/libvirt/-/issues/318
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2092856
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2022-06-03 15:49:01 +02:00
parent a939d4d869
commit 8d3a807a4a

View File

@ -235,7 +235,6 @@ qemuFDPassGetPath(qemuFDPass *fdpass)
struct _qemuFDPassDirect { struct _qemuFDPassDirect {
int fd; int fd;
char *path;
char *name; char *name;
bool passed; /* passed to qemu via monitor */ bool passed; /* passed to qemu via monitor */
@ -251,7 +250,6 @@ qemuFDPassDirectFree(qemuFDPassDirect *fdpass)
VIR_FORCE_CLOSE(fdpass->fd); VIR_FORCE_CLOSE(fdpass->fd);
g_free(fdpass->name); g_free(fdpass->name);
g_free(fdpass->path);
g_free(fdpass); g_free(fdpass);
} }
@ -295,7 +293,8 @@ qemuFDPassDirectTransferCommand(qemuFDPassDirect *fdpass,
return; return;
virCommandPassFD(cmd, fdpass->fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT); virCommandPassFD(cmd, fdpass->fd, VIR_COMMAND_PASS_FD_CLOSE_PARENT);
fdpass->path = g_strdup_printf("%d", fdpass->fd); g_free(fdpass->name);
fdpass->name = g_strdup_printf("%d", fdpass->fd);
fdpass->fd = -1; fdpass->fd = -1;
} }
@ -318,7 +317,6 @@ qemuFDPassDirectTransferMonitor(qemuFDPassDirect *fdpass,
if (qemuMonitorSendFileHandle(mon, fdpass->name, fdpass->fd) < 0) if (qemuMonitorSendFileHandle(mon, fdpass->name, fdpass->fd) < 0)
return -1; return -1;
fdpass->path = g_strdup(fdpass->name);
VIR_FORCE_CLOSE(fdpass->fd); VIR_FORCE_CLOSE(fdpass->fd);
fdpass->passed = true; fdpass->passed = true;
@ -358,5 +356,5 @@ qemuFDPassDirectGetPath(qemuFDPassDirect *fdpass)
if (!fdpass) if (!fdpass)
return NULL; return NULL;
return fdpass->path; return fdpass->name;
} }