On Fri, Jul 23, 2021 at 02:28:23PM +0400, marcandre.lur...@redhat.com wrote: > From: Marc-André Lureau <marcandre.lur...@redhat.com> > > The "serial" chardev calls qemu_chr_open_fd() with the same fd. This > may lead to double-close as each QIOChannel owns the fd. > > Instead, share the reference to the same QIOChannel. > > Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> > --- > chardev/char-fd.c | 15 +++++++++++++-- > 1 file changed, 13 insertions(+), 2 deletions(-) > > diff --git a/chardev/char-fd.c b/chardev/char-fd.c > index ee85a52c06..32166182bf 100644 > --- a/chardev/char-fd.c > +++ b/chardev/char-fd.c > @@ -139,13 +139,24 @@ void qemu_chr_open_fd(Chardev *chr, > qio_channel_set_name(QIO_CHANNEL(s->ioc_in), name); > g_free(name); > } > - if (fd_out >= 0) { > + > + if (fd_out < 0) { > + return; > + } > + > + if (fd_out == fd_in) { > + s->ioc_out = QIO_CHANNEL(object_ref(s->ioc_in)); > + name = g_strdup_printf("chardev-file-%s", chr->label); > + qio_channel_set_name(QIO_CHANNEL(s->ioc_in), name); > + g_free(name);
This is overwriting the name set a few lines earlier. I think the code ought to be refactor to eliminate this duplication. ie if (fd_out == fd_in) { s->ioc_out = s->ioc_in = QIO_CHANNEL(qio_channel_file_new_fd(fd_in)); .... } else { s->ioc_in = QIO_CHANNEL(qio_channel_file_new_fd(fd_in)); ... s->ioc_out = QIO_CHANNEL(qio_channel_file_new_fd(fd_out)); ... } > + } else { > s->ioc_out = QIO_CHANNEL(qio_channel_file_new_fd(fd_out)); > name = g_strdup_printf("chardev-file-out-%s", chr->label); > qio_channel_set_name(QIO_CHANNEL(s->ioc_out), name); > g_free(name); > - qemu_set_nonblock(fd_out); > } > + > + qemu_set_nonblock(fd_out); > } > > static void char_fd_class_init(ObjectClass *oc, void *data) > -- > 2.32.0.264.g75ae10bc75 > Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|