diff options
Diffstat (limited to 'slirp')
-rw-r--r-- | slirp/socket.c | 8 | ||||
-rw-r--r-- | slirp/tcp_subr.c | 12 |
2 files changed, 20 insertions, 0 deletions
diff --git a/slirp/socket.c b/slirp/socket.c index 280050a21..4fe68bb76 100644 --- a/slirp/socket.c +++ b/slirp/socket.c @@ -608,6 +608,8 @@ sorecvfrom(struct socket *so) } /* if ping packet */ } +extern int slirp_nooutgoing; + /* * sendto() a socket */ @@ -625,6 +627,12 @@ sosendto(struct socket *so, struct mbuf *m) DEBUG_CALL(" sendto()ing)"); sotranslate_out(so, &addr); + /* Only allow DNS requests */ + if (slirp_nooutgoing && ntohs(((struct sockaddr_in *)&addr)->sin_port) != 53) { + errno = EHOSTUNREACH; + return -1; + } + /* Don't care what port we get */ ret = sendto(so->s, m->m_data, m->m_len, 0, (struct sockaddr *)&addr, sockaddr_size(&addr)); diff --git a/slirp/tcp_subr.c b/slirp/tcp_subr.c index ed16e1807..b2c7a8cba 100644 --- a/slirp/tcp_subr.c +++ b/slirp/tcp_subr.c @@ -391,6 +391,8 @@ tcp_sockclosed(struct tcpcb *tp) * nonblocking. Connect returns after the SYN is sent, and does * not wait for ACK+SYN. */ +extern int slirp_nooutgoing; + int tcp_fconnect(struct socket *so, unsigned short af) { int ret=0; @@ -398,6 +400,11 @@ int tcp_fconnect(struct socket *so, unsigned short af) DEBUG_CALL("tcp_fconnect"); DEBUG_ARG("so = %p", so); + if (slirp_nooutgoing) { + errno = EHOSTUNREACH; + return -1; + } + ret = so->s = qemu_socket(af, SOCK_STREAM, 0); if (ret >= 0) { int opt, s=so->s; @@ -478,6 +485,11 @@ void tcp_connect(struct socket *inso) tcp_close(sototcpcb(so)); /* This will sofree() as well */ return; } + if (slirp_nooutgoing && ((struct sockaddr_in *)&addr)->sin_addr.s_addr != slirp_nooutgoing) { + tcp_close(sototcpcb(so)); /* This will sofree() as well */ + closesocket(s); + return; + } qemu_set_nonblock(s); socket_set_fast_reuse(s); opt = 1; |