aboutsummaryrefslogtreecommitdiff
path: root/src/socket.c
diff options
context:
space:
mode:
authorGiuseppe Scrivano <gscrivan@redhat.com>2019-11-19 15:56:44 +0100
committerGiuseppe Scrivano <gscrivan@redhat.com>2019-11-21 10:14:15 +0100
commit6d18d6ee651b40b52f59d6d3db4e65456e8435eb (patch)
treeb4b012cf2977766fd60ba897d335e12e391619af /src/socket.c
parentfe80a346505566c4ba46bbecee5a9085f2b2d016 (diff)
downloadslirp-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.c4
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);