chardev/char-socket: tcp_chr_sync_read: don't clobber errno
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> Message-Id: <20211111153354.18807-4-rvkagan@yandex-team.ru> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
This commit is contained in:
parent
e87975051e
commit
666265036f
@ -525,6 +525,7 @@ static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len)
|
|||||||
{
|
{
|
||||||
SocketChardev *s = SOCKET_CHARDEV(chr);
|
SocketChardev *s = SOCKET_CHARDEV(chr);
|
||||||
int size;
|
int size;
|
||||||
|
int saved_errno;
|
||||||
|
|
||||||
if (s->state != TCP_CHARDEV_STATE_CONNECTED) {
|
if (s->state != TCP_CHARDEV_STATE_CONNECTED) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -532,6 +533,7 @@ static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len)
|
|||||||
|
|
||||||
qio_channel_set_blocking(s->ioc, true, NULL);
|
qio_channel_set_blocking(s->ioc, true, NULL);
|
||||||
size = tcp_chr_recv(chr, (void *) buf, len);
|
size = tcp_chr_recv(chr, (void *) buf, len);
|
||||||
|
saved_errno = errno;
|
||||||
if (s->state != TCP_CHARDEV_STATE_DISCONNECTED) {
|
if (s->state != TCP_CHARDEV_STATE_DISCONNECTED) {
|
||||||
qio_channel_set_blocking(s->ioc, false, NULL);
|
qio_channel_set_blocking(s->ioc, false, NULL);
|
||||||
}
|
}
|
||||||
@ -540,6 +542,7 @@ static int tcp_chr_sync_read(Chardev *chr, const uint8_t *buf, int len)
|
|||||||
tcp_chr_disconnect(chr);
|
tcp_chr_disconnect(chr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
errno = saved_errno;
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user