Merge remote-tracking branch 'kiszka/queues/slirp' into staging

* kiszka/queues/slirp:
  slirp: Prevent sending ICMP error replies to source-only addresses
  slirp: Remove unused variable and unused code
master
Anthony Liguori 2012-02-15 18:40:26 -06:00
commit 006c891fc9
2 changed files with 31 additions and 41 deletions

View File

@ -262,6 +262,11 @@ icmp_error(struct mbuf *msrc, u_char type, u_char code, int minsize,
#endif #endif
if(ip->ip_off & IP_OFFMASK) goto end_error; /* Only reply to fragment 0 */ if(ip->ip_off & IP_OFFMASK) goto end_error; /* Only reply to fragment 0 */
/* Do not reply to source-only IPs */
if ((ip->ip_src.s_addr & htonl(~(0xf << 28))) == 0) {
goto end_error;
}
shlen=ip->ip_hl << 2; shlen=ip->ip_hl << 2;
s_ip_len=ip->ip_len; s_ip_len=ip->ip_len;
if(ip->ip_p == IPPROTO_ICMP) { if(ip->ip_p == IPPROTO_ICMP) {

View File

@ -113,7 +113,6 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
struct sockaddr_in addr; struct sockaddr_in addr;
socklen_t addrlen = sizeof(addr); socklen_t addrlen = sizeof(addr);
int opt; int opt;
int master = -1;
const char *argv[256]; const char *argv[256];
/* don't want to clobber the original */ /* don't want to clobber the original */
char *bptr; char *bptr;
@ -148,32 +147,23 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
case -1: case -1:
lprint("Error: fork failed: %s\n", strerror(errno)); lprint("Error: fork failed: %s\n", strerror(errno));
close(s); close(s);
if (do_pty == 2)
close(master);
return 0; return 0;
case 0: case 0:
setsid(); setsid();
/* Set the DISPLAY */ /* Set the DISPLAY */
if (do_pty == 2) { getsockname(s, (struct sockaddr *)&addr, &addrlen);
(void) close(master); close(s);
#ifdef TIOCSCTTY /* XXXXX */ /*
ioctl(s, TIOCSCTTY, (char *)NULL); * Connect to the socket
#endif * XXX If any of these fail, we're in trouble!
} else { */
getsockname(s, (struct sockaddr *)&addr, &addrlen); s = qemu_socket(AF_INET, SOCK_STREAM, 0);
close(s); addr.sin_addr = loopback_addr;
/* do {
* Connect to the socket ret = connect(s, (struct sockaddr *)&addr, addrlen);
* XXX If any of these fail, we're in trouble! } while (ret < 0 && errno == EINTR);
*/
s = qemu_socket(AF_INET, SOCK_STREAM, 0);
addr.sin_addr = loopback_addr;
do {
ret = connect(s, (struct sockaddr *)&addr, addrlen);
} while (ret < 0 && errno == EINTR);
}
dup2(s, 0); dup2(s, 0);
dup2(s, 1); dup2(s, 1);
@ -210,26 +200,21 @@ fork_exec(struct socket *so, const char *ex, int do_pty)
default: default:
qemu_add_child_watch(pid); qemu_add_child_watch(pid);
if (do_pty == 2) { /*
close(s); * XXX this could block us...
so->s = master; * XXX Should set a timer here, and if accept() doesn't
} else { * return after X seconds, declare it a failure
/* * The only reason this will block forever is if socket()
* XXX this could block us... * of connect() fail in the child process
* XXX Should set a timer here, and if accept() doesn't */
* return after X seconds, declare it a failure do {
* The only reason this will block forever is if socket() so->s = accept(s, (struct sockaddr *)&addr, &addrlen);
* of connect() fail in the child process } while (so->s < 0 && errno == EINTR);
*/ closesocket(s);
do { opt = 1;
so->s = accept(s, (struct sockaddr *)&addr, &addrlen); setsockopt(so->s, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int));
} while (so->s < 0 && errno == EINTR); opt = 1;
closesocket(s); setsockopt(so->s, SOL_SOCKET, SO_OOBINLINE, (char *)&opt, sizeof(int));
opt = 1;
setsockopt(so->s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int));
opt = 1;
setsockopt(so->s,SOL_SOCKET,SO_OOBINLINE,(char *)&opt,sizeof(int));
}
fd_nonblock(so->s); fd_nonblock(so->s);
/* Append the telnet options now */ /* Append the telnet options now */