On 03/08/2016 16:55, marcandre.lur...@redhat.com wrote: > @@ -2851,11 +2851,6 @@ static void tcp_chr_disconnect(CharDriverState *chr) > return; > } > > - s->connected = 0; > - if (s->listen_ioc) { > - s->listen_tag = qio_channel_add_watch( > - QIO_CHANNEL(s->listen_ioc), G_IO_IN, tcp_chr_accept, chr, NULL); > - } > tcp_set_msgfds(chr, NULL, 0); > remove_fd_in_watch(chr); > object_unref(OBJECT(s->sioc)); > @@ -2863,6 +2858,24 @@ static void tcp_chr_disconnect(CharDriverState *chr) > object_unref(OBJECT(s->ioc)); > s->ioc = NULL; > g_free(chr->filename); > + chr->filename = NULL; > + s->connected = 0; > +} > + > +static void tcp_chr_disconnect(CharDriverState *chr) > +{ > + TCPCharDriver *s = chr->opaque; > + > + if (!s->connected) { > + return; > + } > + > + tcp_chr_free_connection(chr); > + > + if (s->listen_ioc) { > + s->listen_tag = qio_channel_add_watch( > + QIO_CHANNEL(s->listen_ioc), G_IO_IN, tcp_chr_accept, chr, NULL); > + }
I think if (s->read_msgfds_num) { for (i = 0; i < s->read_msgfds_num; i++) { close(s->read_msgfds[i]); } g_free(s->read_msgfds); } should be moved from tcp_chr_close to tcp_chr_free_connection. The following parts of tcp_chr_close instead are now duplicate, and can be removed: remove_fd_in_watch(chr); if (s->ioc) { object_unref(OBJECT(s->ioc)); } if (s->write_msgfds_num) { g_free(s->write_msgfds); } are now duplicate and can be removed. Finally, since you're at it, here in tcp_set_msgfds: /* clear old pending fd array */ g_free(s->write_msgfds); s->write_msgfds = NULL; it's best to add a s->write_msgfds_num = 0. Thanks, Paolo