Message ID | 1587289900-29485-1-git-send-email-sai.pavan.boddu@xilinx.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] chardev/char-socket: Properly make qio connections non blocking | expand |
On Sun, Apr 19, 2020 at 03:21:40PM +0530, Sai Pavan Boddu wrote: > In tcp_chr_sync_read function, there is a possibility of socket > disconnection during blocking read, then tcp_chr_hup function would clean up > the qio channel pointers(i.e ioc, sioc). > > Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com> > --- > Changes for V2: > Place the guard around 'qio_channel_set_blocking' call to check connection status > This fix is simpler than v1 and explains better about the issue. > > chardev/char-socket.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/chardev/char-socket.c b/chardev/char-socket.c > index 185fe38..e56b2f0 100644 > --- a/chardev/char-socket.c > +++ b/chardev/char-socket.c > @@ -549,7 +549,9 @@ static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len) > > qio_channel_set_blocking(s->ioc, true, NULL); > size = tcp_chr_recv(chr, (void *) buf, len); > - qio_channel_set_blocking(s->ioc, false, NULL); > + if (s->state != TCP_CHARDEV_STATE_DISCONNECTED) { > + qio_channel_set_blocking(s->ioc, false, NULL); > + } > if (size == 0) { > /* connection closed */ > tcp_chr_disconnect(chr); Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Regards, Daniel
On 20/04/20 11:26, Daniel P. Berrangé wrote: > On Sun, Apr 19, 2020 at 03:21:40PM +0530, Sai Pavan Boddu wrote: >> In tcp_chr_sync_read function, there is a possibility of socket >> disconnection during blocking read, then tcp_chr_hup function would clean up >> the qio channel pointers(i.e ioc, sioc). >> >> Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com> >> --- >> Changes for V2: >> Place the guard around 'qio_channel_set_blocking' call to check connection status >> This fix is simpler than v1 and explains better about the issue. >> >> chardev/char-socket.c | 4 +++- >> 1 file changed, 3 insertions(+), 1 deletion(-) >> >> diff --git a/chardev/char-socket.c b/chardev/char-socket.c >> index 185fe38..e56b2f0 100644 >> --- a/chardev/char-socket.c >> +++ b/chardev/char-socket.c >> @@ -549,7 +549,9 @@ static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len) >> >> qio_channel_set_blocking(s->ioc, true, NULL); >> size = tcp_chr_recv(chr, (void *) buf, len); >> - qio_channel_set_blocking(s->ioc, false, NULL); >> + if (s->state != TCP_CHARDEV_STATE_DISCONNECTED) { >> + qio_channel_set_blocking(s->ioc, false, NULL); >> + } >> if (size == 0) { >> /* connection closed */ >> tcp_chr_disconnect(chr); > > Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> > > > Regards, > Daniel > Queued, thanks. Paolo
diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 185fe38..e56b2f0 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -549,7 +549,9 @@ static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len) qio_channel_set_blocking(s->ioc, true, NULL); size = tcp_chr_recv(chr, (void *) buf, len); - qio_channel_set_blocking(s->ioc, false, NULL); + if (s->state != TCP_CHARDEV_STATE_DISCONNECTED) { + qio_channel_set_blocking(s->ioc, false, NULL); + } if (size == 0) { /* connection closed */ tcp_chr_disconnect(chr);
In tcp_chr_sync_read function, there is a possibility of socket disconnection during blocking read, then tcp_chr_hup function would clean up the qio channel pointers(i.e ioc, sioc). Signed-off-by: Sai Pavan Boddu <sai.pavan.boddu@xilinx.com> --- Changes for V2: Place the guard around 'qio_channel_set_blocking' call to check connection status This fix is simpler than v1 and explains better about the issue. chardev/char-socket.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)