xl: fix memory management of migration_domname_r
authorIan Jackson <ian.jackson@eu.citrix.com>
Tue, 14 Sep 2010 17:25:15 +0000 (18:25 +0100)
committerIan Jackson <ian.jackson@eu.citrix.com>
Tue, 14 Sep 2010 17:25:15 +0000 (18:25 +0100)
During migration, the domain name from the config file is swapped out
and replaced with a different name (with the "--incoming" suffix),
which we return to the caller.  The memory management arrangements
here were broken.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/libxl/xl_cmdimpl.c

index 547b2f6fa5d445ba4b93ee24cbe71474e3d29591..12be40e942c5a92bfb8cb8c294344d4ef8018da2 100644 (file)
@@ -1209,7 +1209,7 @@ struct domain_create {
     const char *extra_config; /* extra config string */
     const char *restore_file;
     int migrate_fd; /* -1 means none */
-    char **migration_domname_r;
+    char **migration_domname_r; /* from malloc */
 };
 
 static int create_domain(struct domain_create *dom_info)
@@ -1227,7 +1227,6 @@ static int create_domain(struct domain_create *dom_info)
     const char *extra_config = dom_info->extra_config;
     const char *restore_file = dom_info->restore_file;
     int migrate_fd = dom_info->migrate_fd;
-    char **migration_domname_r = dom_info->migration_domname_r;
 
     int i, fd;
     int need_daemon = 1;
@@ -1353,12 +1352,16 @@ static int create_domain(struct domain_create *dom_info)
             /* when we receive a domain we get its name from the config
              * file; and we receive it to a temporary name */
             assert(!common_domname);
+            
             common_domname = d_config.c_info.name;
-            if (asprintf(migration_domname_r, "%s--incoming", d_config.c_info.name) < 0) {
+            d_config.c_info.name = 0; /* steals allocation from config */
+
+            if (asprintf(&d_config.c_info.name,
+                         "%s--incoming", d_config.c_info.name) < 0) {
                 fprintf(stderr, "Failed to allocate memory in asprintf\n");
                 exit(1);
             }
-            d_config.c_info.name = *migration_domname_r;
+            *dom_info->migration_domname_r = strdup(d_config.c_info.name);
         }
     }