[libvirt] [PATCH] libxl: fix leaking of allocated migration ports

Although the migration port is immediately released in the finish phase of migration, it was never set in the domain private object when allocated in the prepare phase. So libxlDomainMigrationFinish() always released a 0-initialized migrationPort, leaking any allocated port. After enough migrations to exhaust the migration port pool, migration would fail with error: internal error: Unable to find an unused port in range 'migration' (49152-49216) Fix it by setting libxlDomainObjPrivate->migrationPort to the port allocated in the prepare phase. While at it, also fix leaking an allocated port if the prepare phase fails. Signed-off-by: Jim Fehlig <jfehlig@suse.com> --- src/libxl/libxl_migration.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c index 534abb8..a471d2a 100644 --- a/src/libxl/libxl_migration.c +++ b/src/libxl/libxl_migration.c @@ -594,6 +594,7 @@ libxlDomainMigrationPrepare(virConnectPtr dconn, if (virPortAllocatorAcquire(driver->migrationPorts, &port) < 0) goto error; + priv->migrationPort = port; if (virAsprintf(uri_out, "tcp://%s:%d", hostname, port) < 0) goto error; } else { @@ -628,6 +629,7 @@ libxlDomainMigrationPrepare(virConnectPtr dconn, if (virPortAllocatorAcquire(driver->migrationPorts, &port) < 0) goto error; + priv->migrationPort = port; } else { port = uri->port; } @@ -690,6 +692,8 @@ libxlDomainMigrationPrepare(virConnectPtr dconn, } VIR_FREE(socks); virObjectUnref(args); + virPortAllocatorRelease(driver->migrationPorts, priv->migrationPort); + priv->migrationPort = 0; /* Remove virDomainObj from domain list */ if (vm) { -- 2.9.2

On Fri, Oct 14, 2016 at 12:19:19PM -0600, Jim Fehlig wrote:
Although the migration port is immediately released in the finish phase of migration, it was never set in the domain private object when allocated in the prepare phase. So libxlDomainMigrationFinish() always released a 0-initialized migrationPort, leaking any allocated port. After enough migrations to exhaust the migration port pool, migration would fail with
error: internal error: Unable to find an unused port in range 'migration' (49152-49216)
Fix it by setting libxlDomainObjPrivate->migrationPort to the port allocated in the prepare phase. While at it, also fix leaking an allocated port if the prepare phase fails.
Signed-off-by: Jim Fehlig <jfehlig@suse.com> ---
ACK Pavel

On 10/21/2016 04:41 AM, Pavel Hrdina wrote:
On Fri, Oct 14, 2016 at 12:19:19PM -0600, Jim Fehlig wrote:
Although the migration port is immediately released in the finish phase of migration, it was never set in the domain private object when allocated in the prepare phase. So libxlDomainMigrationFinish() always released a 0-initialized migrationPort, leaking any allocated port. After enough migrations to exhaust the migration port pool, migration would fail with
error: internal error: Unable to find an unused port in range 'migration' (49152-49216)
Fix it by setting libxlDomainObjPrivate->migrationPort to the port allocated in the prepare phase. While at it, also fix leaking an allocated port if the prepare phase fails.
Signed-off-by: Jim Fehlig <jfehlig@suse.com> --- ACK
Thanks. Pushed now. Regards, Jim
participants (2)
-
Jim Fehlig
-
Pavel Hrdina