From 3a179c661434364607cf45882ab8b12cd6d32b27 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Tue, 6 Oct 2009 12:16:56 +0100 Subject: [PATCH] Make net_client_init() consume slirp_configs even on error net_slirp_init() walks slirp_configs, and stops when it encounters one that doesn't work. Instead of consuming slirp_configs members there, consume them in the sole caller. This makes sure all are consumed. Before, the tail starting with the non-working one was left in place, where it made the next net_slirp_init() fail again. Signed-off-by: Markus Armbruster Signed-off-by: Mark McLoughlin Signed-off-by: Anthony Liguori --- net.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/net.c b/net.c index 0e5afa9796..a2507f991c 100644 --- a/net.c +++ b/net.c @@ -761,6 +761,7 @@ static int net_slirp_init(Monitor *mon, VLANState *vlan, const char *model, uint32_t addr; int shift; char *end; + struct slirp_config_str *config; if (!tftp_export) { tftp_export = legacy_tftp_prefix; @@ -845,9 +846,7 @@ static int net_slirp_init(Monitor *mon, VLANState *vlan, const char *model, tftp_export, bootfile, dhcp, dns, s); QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry); - while (slirp_configs) { - struct slirp_config_str *config = slirp_configs; - + for (config = slirp_configs; config; config = config->next) { if (config->flags & SLIRP_CFG_HOSTFWD) { slirp_hostfwd(s, mon, config->str, config->flags & SLIRP_CFG_LEGACY); @@ -855,8 +854,6 @@ static int net_slirp_init(Monitor *mon, VLANState *vlan, const char *model, slirp_guestfwd(s, mon, config->str, config->flags & SLIRP_CFG_LEGACY); } - slirp_configs = config->next; - qemu_free(config); } #ifndef _WIN32 if (!smb_export) { @@ -2593,6 +2590,11 @@ int net_client_init(Monitor *mon, const char *device, const char *p) ret = net_slirp_init(mon, vlan, device, name, restricted, vnet, vhost, vhostname, tftp_export, bootfile, vdhcp_start, vnamesrv, smb_export, vsmbsrv); + while (slirp_configs) { + config = slirp_configs; + slirp_configs = config->next; + qemu_free(config); + } qemu_free(vnet); qemu_free(vhost); qemu_free(vhostname);