diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index ffc86a461ec5d1b03509091aeb1fd7ba67f0f8c5..7aa0476fc30fe8767a852263ade003654ba24e2c 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1193,6 +1193,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver, size_t i, lastGood = 0; char *diskAlias = NULL; char *nbd_dest = NULL; + char *hoststr = NULL; unsigned int mirror_flags = VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT; virErrorPtr err = NULL; @@ -1212,6 +1213,16 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver, port = mig->nbd->port; mig->nbd->port = 0; + /* escape literal IPv6 address */ + if (strchr(host, ':')) { + if (virAsprintf(&hoststr, "[%s]", host) < 0) { + virReportOOMError(); + goto error; + } + } else if (VIR_STRDUP(hoststr, host) < 0) { + goto error; + } + if (*migrate_flags & QEMU_MONITOR_MIGRATE_NON_SHARED_INC) mirror_flags |= VIR_DOMAIN_BLOCK_REBASE_SHALLOW; @@ -1228,7 +1239,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver, if ((virAsprintf(&diskAlias, "%s%s", QEMU_DRIVE_HOST_PREFIX, disk->info.alias) < 0) || (virAsprintf(&nbd_dest, "nbd:%s:%d:exportname=%s", - host, port, diskAlias) < 0)) { + hoststr, port, diskAlias) < 0)) { virReportOOMError(); goto error; } @@ -1297,6 +1308,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver, cleanup: VIR_FREE(diskAlias); VIR_FREE(nbd_dest); + VIR_FREE(hoststr); return ret; error: