Patchwork Make net_client_init() consume slirp_configs even on error

login
register
mail settings
Submitter Mark McLoughlin
Date Oct. 6, 2009, 11:16 a.m.
Message ID <1254827836-11021-7-git-send-email-markmc@redhat.com>
Download mbox | patch
Permalink /patch/35092/
State Superseded
Headers show

Comments

Mark McLoughlin - Oct. 6, 2009, 11:16 a.m.
From: Markus Armbruster <armbru@redhat.com>

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>
---
 net.c |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)

Patch

diff --git a/net.c b/net.c
index 0e5afa9..a2507f9 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);