Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.1:kernel-2.6.32
kvm
kvm-studio-slirp-nooutgoing.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File kvm-studio-slirp-nooutgoing.patch of Package kvm
Index: qemu-kvm-0.10.5/vl.c =================================================================== --- qemu-kvm-0.10.5.orig/vl.c +++ qemu-kvm-0.10.5/vl.c @@ -241,6 +241,7 @@ const char *vnc_display; int acpi_enabled = 1; int no_hpet = 0; int fd_bootchk = 1; +int slirp_nooutgoing = 0; int no_reboot = 0; int no_shutdown = 0; int cursor_hide = 1; @@ -4302,6 +4303,7 @@ enum { QEMU_OPTION_initrd, /* Debug/Expert options: */ + QEMU_OPTION_nooutgoing, QEMU_OPTION_serial, QEMU_OPTION_parallel, QEMU_OPTION_monitor, @@ -4439,6 +4441,7 @@ static const QEMUOption qemu_options[] = { "initrd", HAS_ARG, QEMU_OPTION_initrd }, /* Debug/Expert options: */ + { "nooutgoing", HAS_ARG, QEMU_OPTION_nooutgoing }, { "serial", HAS_ARG, QEMU_OPTION_serial }, { "parallel", HAS_ARG, QEMU_OPTION_parallel }, { "monitor", HAS_ARG, QEMU_OPTION_monitor }, @@ -5286,6 +5289,14 @@ int main(int argc, char **argv, char **e case QEMU_OPTION_bios: bios_name = optarg; break; + case QEMU_OPTION_nooutgoing: + slirp_nooutgoing = inet_addr(optarg); + if (slirp_nooutgoing == INADDR_NONE) { + printf("Invalid address: %s.\nOnly addresses of the format " + "xxx.xxx.xxx.xxx are supported.\n", optarg); + exit(1); + } + break; case QEMU_OPTION_S: autostart = 0; break; Index: qemu-kvm-0.10.5/slirp/tcp_subr.c =================================================================== --- qemu-kvm-0.10.5.orig/slirp/tcp_subr.c +++ qemu-kvm-0.10.5/slirp/tcp_subr.c @@ -375,6 +375,9 @@ tcp_sockclosed(tp) * nonblocking. Connect returns after the SYN is sent, and does * not wait for ACK+SYN. */ + +extern int slirp_nooutgoing; + int tcp_fconnect(so) struct socket *so; { @@ -383,6 +386,11 @@ int tcp_fconnect(so) DEBUG_CALL("tcp_fconnect"); DEBUG_ARG("so = %lx", (long )so); + if (slirp_nooutgoing) { + errno = EHOSTUNREACH; + return -1; + } + if( (ret=so->s=socket(AF_INET,SOCK_STREAM,0)) >= 0) { int opt, s=so->s; struct sockaddr_in addr; @@ -477,6 +485,13 @@ tcp_connect(inso) tcp_close(sototcpcb(so)); /* This will sofree() as well */ return; } + + if (slirp_nooutgoing && addr.sin_addr.s_addr != slirp_nooutgoing) { + tcp_close(sototcpcb(so)); /* This will sofree() as well */ + close(s); + return; + } + fd_nonblock(s); opt = 1; setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,sizeof(int)); @@ -487,6 +502,7 @@ tcp_connect(inso) so->so_fport = addr.sin_port; so->so_faddr = addr.sin_addr; + /* Translate connections from localhost to the real hostname */ if (so->so_faddr.s_addr == 0 || so->so_faddr.s_addr == loopback_addr.s_addr) so->so_faddr = alias_addr; Index: qemu-kvm-0.10.5/slirp/socket.c =================================================================== --- qemu-kvm-0.10.5.orig/slirp/socket.c +++ qemu-kvm-0.10.5/slirp/socket.c @@ -547,6 +547,8 @@ sorecvfrom(so) } /* if ping packet */ } +extern int slirp_nooutgoing; + /* * sendto() a socket */ @@ -580,6 +582,12 @@ sosendto(so, m) DEBUG_MISC((dfd, " sendto()ing, addr.sin_port=%d, addr.sin_addr.s_addr=%.16s\n", ntohs(addr.sin_port), inet_ntoa(addr.sin_addr))); + /* Only allow DNS requests */ + if (slirp_nooutgoing && ntohs(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, sizeof (struct sockaddr));
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor