Commit bb53fc5394201c0cbe3c89a1c9fa5fbd6a3b832c
Committed by
Anthony Liguori
1 parent
9dfd7c7a
slirp: Fix guestfwd for incoming data
Unless a virtual server address was explicitly defined (which is impossible with the legacy -net channel format), guestfwd did not properly forwarded host->guest packets. This patch fixes it. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
3 changed files
with
14 additions
and
13 deletions
net.c
... | ... | @@ -1150,7 +1150,7 @@ static void slirp_smb(SlirpState* s, Monitor *mon, const char *exported_dir, |
1150 | 1150 | snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s", |
1151 | 1151 | SMBD_COMMAND, smb_conf); |
1152 | 1152 | |
1153 | - if (slirp_add_exec(s->slirp, 0, smb_cmdline, vserver_addr, 139) < 0) { | |
1153 | + if (slirp_add_exec(s->slirp, 0, smb_cmdline, &vserver_addr, 139) < 0) { | |
1154 | 1154 | slirp_smb_cleanup(s); |
1155 | 1155 | config_error(mon, "conflicting/invalid smbserver address\n"); |
1156 | 1156 | } |
... | ... | @@ -1239,16 +1239,17 @@ static void slirp_guestfwd(SlirpState *s, Monitor *mon, const char *config_str, |
1239 | 1239 | qemu_free(fwd); |
1240 | 1240 | return; |
1241 | 1241 | } |
1242 | - fwd->server = server; | |
1243 | - fwd->port = port; | |
1244 | - fwd->slirp = s->slirp; | |
1245 | 1242 | |
1246 | - if (slirp_add_exec(s->slirp, 3, fwd->hd, server, port) < 0) { | |
1243 | + if (slirp_add_exec(s->slirp, 3, fwd->hd, &server, port) < 0) { | |
1247 | 1244 | config_error(mon, "conflicting/invalid host:port in guest forwarding " |
1248 | 1245 | "rule '%s'\n", config_str); |
1249 | 1246 | qemu_free(fwd); |
1250 | 1247 | return; |
1251 | 1248 | } |
1249 | + fwd->server = server; | |
1250 | + fwd->port = port; | |
1251 | + fwd->slirp = s->slirp; | |
1252 | + | |
1252 | 1253 | qemu_chr_add_handlers(fwd->hd, guestfwd_can_read, guestfwd_read, |
1253 | 1254 | NULL, fwd); |
1254 | 1255 | return; | ... | ... |
slirp/libslirp.h
... | ... | @@ -33,7 +33,7 @@ int slirp_add_hostfwd(Slirp *slirp, int is_udp, |
33 | 33 | int slirp_remove_hostfwd(Slirp *slirp, int is_udp, |
34 | 34 | struct in_addr host_addr, int host_port); |
35 | 35 | int slirp_add_exec(Slirp *slirp, int do_pty, const void *args, |
36 | - struct in_addr guest_addr, int guest_port); | |
36 | + struct in_addr *guest_addr, int guest_port); | |
37 | 37 | |
38 | 38 | void slirp_connection_info(Slirp *slirp, Monitor *mon); |
39 | 39 | ... | ... |
slirp/slirp.c
... | ... | @@ -794,19 +794,19 @@ int slirp_add_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, |
794 | 794 | } |
795 | 795 | |
796 | 796 | int slirp_add_exec(Slirp *slirp, int do_pty, const void *args, |
797 | - struct in_addr guest_addr, int guest_port) | |
797 | + struct in_addr *guest_addr, int guest_port) | |
798 | 798 | { |
799 | - if (!guest_addr.s_addr) { | |
800 | - guest_addr.s_addr = slirp->vnetwork_addr.s_addr | | |
799 | + if (!guest_addr->s_addr) { | |
800 | + guest_addr->s_addr = slirp->vnetwork_addr.s_addr | | |
801 | 801 | (htonl(0x0204) & ~slirp->vnetwork_mask.s_addr); |
802 | 802 | } |
803 | - if ((guest_addr.s_addr & slirp->vnetwork_mask.s_addr) != | |
803 | + if ((guest_addr->s_addr & slirp->vnetwork_mask.s_addr) != | |
804 | 804 | slirp->vnetwork_addr.s_addr || |
805 | - guest_addr.s_addr == slirp->vhost_addr.s_addr || | |
806 | - guest_addr.s_addr == slirp->vnameserver_addr.s_addr) { | |
805 | + guest_addr->s_addr == slirp->vhost_addr.s_addr || | |
806 | + guest_addr->s_addr == slirp->vnameserver_addr.s_addr) { | |
807 | 807 | return -1; |
808 | 808 | } |
809 | - return add_exec(&slirp->exec_list, do_pty, (char *)args, guest_addr, | |
809 | + return add_exec(&slirp->exec_list, do_pty, (char *)args, *guest_addr, | |
810 | 810 | htons(guest_port)); |
811 | 811 | } |
812 | 812 | ... | ... |