On Thu, Nov 11, 2021 at 7:38 PM Roman Kagan <rvkagan@yandex-team.ru> wrote:
> tcp_chr_recv communicates the specific error condition to the caller via
> errno. However, after setting it, it may call into some system calls or
> library functions which can clobber the errno.
>
> Avoid this by moving the errno assignment to the end of the function.
>
> Signed-off-by: Roman Kagan <rvkagan@yandex-team.ru>
>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
> chardev/char-socket.c | 14 +++++++-------
> 1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/chardev/char-socket.c b/chardev/char-socket.c
> index 836cfa0bc2..90054ce58c 100644
> --- a/chardev/char-socket.c
> +++ b/chardev/char-socket.c
> @@ -346,13 +346,6 @@ static ssize_t tcp_chr_recv(Chardev *chr, char *buf,
> size_t len)
> NULL);
> }
>
> - if (ret == QIO_CHANNEL_ERR_BLOCK) {
> - errno = EAGAIN;
> - ret = -1;
> - } else if (ret == -1) {
> - errno = EIO;
> - }
> -
> if (msgfds_num) {
> /* close and clean read_msgfds */
> for (i = 0; i < s->read_msgfds_num; i++) {
> @@ -381,6 +374,13 @@ static ssize_t tcp_chr_recv(Chardev *chr, char *buf,
> size_t len)
> #endif
> }
>
> + if (ret == QIO_CHANNEL_ERR_BLOCK) {
> + errno = EAGAIN;
> + ret = -1;
> + } else if (ret == -1) {
> + errno = EIO;
> + }
> +
> return ret;
> }
>
> --
> 2.33.1
>
>
>
--
Marc-André Lureau