diff options
author | Giuseppe Scrivano <gscrivan@redhat.com> | 2019-11-19 15:56:44 +0100 |
---|---|---|
committer | Giuseppe Scrivano <gscrivan@redhat.com> | 2019-11-21 10:14:15 +0100 |
commit | 6d18d6ee651b40b52f59d6d3db4e65456e8435eb (patch) | |
tree | b4b012cf2977766fd60ba897d335e12e391619af /src/socket.c | |
parent | fe80a346505566c4ba46bbecee5a9085f2b2d016 (diff) | |
download | slirp-6d18d6ee651b40b52f59d6d3db4e65456e8435eb.zip slirp-6d18d6ee651b40b52f59d6d3db4e65456e8435eb.tar.gz slirp-6d18d6ee651b40b52f59d6d3db4e65456e8435eb.tar.bz2 |
socket: avoid getpeername after shutdown(SHUT_WR)
avoid using getpeername(2) if the socket was already closed for
writing, as it will report the socket as disconnected.
Using getsockopt instead ensures there is no error returned.
Closes: https://gitlab.freedesktop.org/slirp/libslirp/issues/12
Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
Diffstat (limited to 'src/socket.c')
-rw-r--r-- | src/socket.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/src/socket.c b/src/socket.c index d96d8c4..2f20028 100644 --- a/src/socket.c +++ b/src/socket.c @@ -195,7 +195,9 @@ int soread(struct socket *so) err = errno; if (nn == 0) { - if (getpeername(so->s, paddr, &alen) < 0) { + int shutdown_wr = so->so_state & SS_FCANTSENDMORE; + + if (!shutdown_wr && getpeername(so->s, paddr, &alen) < 0) { err = errno; } else { getsockopt(so->s, SOL_SOCKET, SO_ERROR, &err, &elen); |