Message ID | 20211111153354.18807-4-rvkagan@yandex-team.ru (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | vhost: stick to -errno error return convention | expand |
On Thu, Nov 11, 2021 at 7:36 PM Roman Kagan <rvkagan@yandex-team.ru> wrote: > After the return from tcp_chr_recv, tcp_chr_sync_read calls into a > function which eventually makes a system call and may clobber errno. > > Make a copy of errno right after tcp_chr_recv and restore the errno on > return from tcp_chr_sync_read. > > Signed-off-by: Roman Kagan <rvkagan@yandex-team.ru> > Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> --- > chardev/char-socket.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/chardev/char-socket.c b/chardev/char-socket.c > index 90054ce58c..cf7f2ba65a 100644 > --- a/chardev/char-socket.c > +++ b/chardev/char-socket.c > @@ -581,6 +581,7 @@ static int tcp_chr_sync_read(Chardev *chr, const > uint8_t *buf, int len) > { > SocketChardev *s = SOCKET_CHARDEV(chr); > int size; > + int saved_errno; > > if (s->state != TCP_CHARDEV_STATE_CONNECTED) { > return 0; > @@ -588,6 +589,7 @@ 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); > + saved_errno = errno; > if (s->state != TCP_CHARDEV_STATE_DISCONNECTED) { > qio_channel_set_blocking(s->ioc, false, NULL); > } > @@ -596,6 +598,7 @@ static int tcp_chr_sync_read(Chardev *chr, const > uint8_t *buf, int len) > tcp_chr_disconnect(chr); > } > > + errno = saved_errno; > return size; > } > > -- > 2.33.1 > > >
diff --git a/chardev/char-socket.c b/chardev/char-socket.c index 90054ce58c..cf7f2ba65a 100644 --- a/chardev/char-socket.c +++ b/chardev/char-socket.c @@ -581,6 +581,7 @@ static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len) { SocketChardev *s = SOCKET_CHARDEV(chr); int size; + int saved_errno; if (s->state != TCP_CHARDEV_STATE_CONNECTED) { return 0; @@ -588,6 +589,7 @@ 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); + saved_errno = errno; if (s->state != TCP_CHARDEV_STATE_DISCONNECTED) { qio_channel_set_blocking(s->ioc, false, NULL); } @@ -596,6 +598,7 @@ static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len) tcp_chr_disconnect(chr); } + errno = saved_errno; return size; }
After the return from tcp_chr_recv, tcp_chr_sync_read calls into a function which eventually makes a system call and may clobber errno. Make a copy of errno right after tcp_chr_recv and restore the errno on return from tcp_chr_sync_read. Signed-off-by: Roman Kagan <rvkagan@yandex-team.ru> --- chardev/char-socket.c | 3 +++ 1 file changed, 3 insertions(+)