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 <llyzs.vic@gmail.com> Message-Id: <20190301064809.3074-1-llyzs.vic@gmail.com> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
This commit is contained in:
parent
8cabd8778c
commit
6c419a1e06
@ -529,6 +529,15 @@ sorecvfrom(struct socket *so)
|
|||||||
int n;
|
int n;
|
||||||
#endif
|
#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);
|
m = m_get(so->slirp);
|
||||||
if (!m) {
|
if (!m) {
|
||||||
return;
|
return;
|
||||||
@ -552,7 +561,6 @@ sorecvfrom(struct socket *so)
|
|||||||
*/
|
*/
|
||||||
len = M_FREEROOM(m);
|
len = M_FREEROOM(m);
|
||||||
/* if (so->so_fport != htons(53)) { */
|
/* if (so->so_fport != htons(53)) { */
|
||||||
ioctlsocket(so->s, FIONREAD, &n);
|
|
||||||
|
|
||||||
if (n > len) {
|
if (n > len) {
|
||||||
n = (m->m_data - m->m_dat) + m->m_len + n + 1;
|
n = (m->m_data - m->m_dat) + m->m_len + n + 1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user