From: Vic Lee Date: Fri, 1 Mar 2019 06:48:09 +0000 (+0800) Subject: slirp: check for ioctlsocket error and 0-length udp payload. X-Git-Tag: v4.0.0-rc0~51^2~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6c419a1e06c21c4568d5a12a9c5cafcdb00f6aa8;p=thirdparty%2Fqemu.git slirp: check for ioctlsocket error and 0-length udp payload. Sometimes sorecvfrom() is called from slirp.c because revents == G_IO_IN, but there is 0 bytes available and recvfrom could be blocking indefinitely. This is likely due to 0-length udp payload. This also adds an error checking for ioctlsocket. Signed-off-by: Vic Lee Message-Id: <20190301064809.3074-1-llyzs.vic@gmail.com> Signed-off-by: Samuel Thibault --- diff --git a/slirp/socket.c b/slirp/socket.c index 4876ea3f315..4dc5e2907d6 100644 --- a/slirp/socket.c +++ b/slirp/socket.c @@ -529,6 +529,15 @@ sorecvfrom(struct socket *so) int n; #endif + if (ioctlsocket(so->s, FIONREAD, &n) != 0) { + DEBUG_MISC(" ioctlsocket errno = %d-%s\n", + errno,strerror(errno)); + return; + } + if (n == 0) { + return; + } + m = m_get(so->slirp); if (!m) { return; @@ -552,7 +561,6 @@ sorecvfrom(struct socket *so) */ len = M_FREEROOM(m); /* if (so->so_fport != htons(53)) { */ - ioctlsocket(so->s, FIONREAD, &n); if (n > len) { n = (m->m_data - m->m_dat) + m->m_len + n + 1;