aboutsummaryrefslogtreecommitdiff
path: root/slirp.c
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@siemens.com>2009-06-24 14:42:28 +0200
committerAnthony Liguori <aliguori@us.ibm.com>2009-06-29 08:52:45 -0500
commitcecc828f6d3ae7e430844a6f8dc6486f46a33cba (patch)
treecb011136e8d7c74f7596ac50c6374c7a164e3151 /slirp.c
parente65b3854303b1437b1d221605bd99810dddcab6e (diff)
downloadslirp-cecc828f6d3ae7e430844a6f8dc6486f46a33cba.zip
slirp-cecc828f6d3ae7e430844a6f8dc6486f46a33cba.tar.gz
slirp-cecc828f6d3ae7e430844a6f8dc6486f46a33cba.tar.bz2
slirp: Fix port comparision in slirp_remove_hostfwd
For UDP host forwardings, fport is not stable, every outgoing packet of the redirection can modify it. Use getsockname instead to look up the port that is actually used on the host side. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'slirp.c')
-rw-r--r--slirp.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/slirp.c b/slirp.c
index f39e6ff..f3d5824 100644
--- a/slirp.c
+++ b/slirp.c
@@ -763,12 +763,16 @@ int slirp_remove_hostfwd(int is_udp, int host_port)
{
struct socket *so;
struct socket *head = (is_udp ? &udb : &tcb);
- int fport = htons(host_port);
+ struct sockaddr_in addr;
+ int port = htons(host_port);
+ socklen_t addr_len;
int n = 0;
loop_again:
for (so = head->so_next; so != head; so = so->so_next) {
- if (so->so_fport == fport) {
+ addr_len = sizeof(addr);
+ if (getsockname(so->s, (struct sockaddr *)&addr, &addr_len) == 0 &&
+ addr.sin_port == port) {
close(so->s);
sofree(so);
n++;