diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index c9b9850077..313894357d 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4329,6 +4329,14 @@ qemuBuildCommandLine(virConnectPtr conn, } else if (STREQ(migrateFrom, "stdio")) { if (qemuCapsGet(qemuCaps, QEMU_CAPS_MIGRATE_QEMU_FD)) { virCommandAddArgFormat(cmd, "fd:%d", migrateFd); + /* migrateFd might be cloexec, but qemu must inherit + * it if vmop indicates qemu will be executed */ + if (vmop != VIR_VM_OP_NO_OP && + virSetInherit(migrateFd, true) < 0) { + qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Failed to clear cloexec flag")); + goto error; + } virCommandPreserveFD(cmd, migrateFd); } else if (qemuCapsGet(qemuCaps, QEMU_CAPS_MIGRATE_QEMU_EXEC)) { virCommandAddArg(cmd, "exec:cat"); @@ -4358,6 +4366,14 @@ qemuBuildCommandLine(virConnectPtr conn, goto error; } virCommandAddArg(cmd, migrateFrom); + /* migrateFd might be cloexec, but qemu must inherit + * it if vmop indicates qemu will be executed */ + if (vmop != VIR_VM_OP_NO_OP && + virSetInherit(migrateFd, true) < 0) { + qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("Failed to clear cloexec flag")); + goto error; + } virCommandPreserveFD(cmd, migrateFd); } else if (STRPREFIX(migrateFrom, "unix")) { if (!qemuCapsGet(qemuCaps, QEMU_CAPS_MIGRATE_QEMU_UNIX)) { diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index c1329faf13..02de8de1a6 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -122,7 +122,7 @@ static int testCompareXMLToArgvFiles(const char *xml, if (!(cmd = qemuBuildCommandLine(conn, &driver, vmdef, &monitor_chr, false, extraFlags, migrateFrom, migrateFd, NULL, - VIR_VM_OP_CREATE))) + VIR_VM_OP_NO_OP))) goto fail; if (!!virGetLastError() != expectError) {