diff options
author | Markus Armbruster <armbru@redhat.com> | 2009-10-06 12:16:56 +0100 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-10-06 14:36:10 -0500 |
commit | 3a179c661434364607cf45882ab8b12cd6d32b27 (patch) | |
tree | f100934518cdf1ef4dd6469b0f415356f0550c19 | |
parent | 02374aa02a48e2d00c57b3d9b7b30821dcb2c139 (diff) |
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 <armbru@redhat.com>
Signed-off-by: Mark McLoughlin <markmc@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r-- | net.c | 12 |
1 files changed, 7 insertions, 5 deletions
@@ -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); |