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 | ... | ... |