char *objalias = NULL;
const char *backendType;
bool objAdded = false;
+ bool teardownlabel = false;
virJSONValuePtr props = NULL;
virObjectEventPtr event;
int id;
priv->qemuCaps, vm->def, mem, NULL, true) < 0)
goto cleanup;
- if (virDomainMemoryInsert(vm->def, mem) < 0) {
- virJSONValueFree(props);
+ if (qemuSecuritySetMemoryLabel(driver, vm, mem) < 0)
goto cleanup;
- }
+ teardownlabel = true;
- if (qemuDomainAdjustMaxMemLock(vm) < 0) {
- virJSONValueFree(props);
+ if (virDomainMemoryInsert(vm->def, mem) < 0)
+ goto cleanup;
+
+ if (qemuDomainAdjustMaxMemLock(vm) < 0)
goto removedef;
- }
qemuDomainObjEnterMonitor(driver, vm);
rv = qemuMonitorAddObject(priv->mon, backendType, objalias, props);
audit:
virDomainAuditMemory(vm, oldmem, newmem, "update", ret == 0);
cleanup:
+ if (mem && ret < 0) {
+ if (teardownlabel && qemuSecurityRestoreMemoryLabel(driver, vm, mem) < 0)
+ VIR_WARN("Unable to restore security label on memdev");
+ }
+
+ virJSONValueFree(props);
virObjectUnref(cfg);
VIR_FREE(devstr);
VIR_FREE(objalias);
if ((idx = virDomainMemoryFindByDef(vm->def, mem)) >= 0)
virDomainMemoryRemove(vm->def, idx);
+ if (qemuSecurityRestoreMemoryLabel(driver, vm, mem) < 0)
+ VIR_WARN("Unable to restore security label on memdev");
+
virDomainMemoryDefFree(mem);
/* fix the balloon size */
virSecurityManagerTransactionAbort(driver->securityManager);
return ret;
}
+
+
+int
+qemuSecuritySetMemoryLabel(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ virDomainMemoryDefPtr mem)
+{
+ int ret = -1;
+
+ if (qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT) &&
+ virSecurityManagerTransactionStart(driver->securityManager) < 0)
+ goto cleanup;
+
+ if (virSecurityManagerSetMemoryLabel(driver->securityManager,
+ vm->def,
+ mem) < 0)
+ goto cleanup;
+
+ if (qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT) &&
+ virSecurityManagerTransactionCommit(driver->securityManager,
+ vm->pid) < 0)
+ goto cleanup;
+
+ ret = 0;
+ cleanup:
+ virSecurityManagerTransactionAbort(driver->securityManager);
+ return ret;
+}
+
+
+int
+qemuSecurityRestoreMemoryLabel(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ virDomainMemoryDefPtr mem)
+{
+ int ret = -1;
+
+ if (qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT) &&
+ virSecurityManagerTransactionStart(driver->securityManager) < 0)
+ goto cleanup;
+
+ if (virSecurityManagerRestoreMemoryLabel(driver->securityManager,
+ vm->def,
+ mem) < 0)
+ goto cleanup;
+
+ if (qemuDomainNamespaceEnabled(vm, QEMU_DOMAIN_NS_MOUNT) &&
+ virSecurityManagerTransactionCommit(driver->securityManager,
+ vm->pid) < 0)
+ goto cleanup;
+
+ ret = 0;
+ cleanup:
+ virSecurityManagerTransactionAbort(driver->securityManager);
+ return ret;
+}
virDomainObjPtr vm,
virDomainHostdevDefPtr hostdev);
+int qemuSecuritySetMemoryLabel(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ virDomainMemoryDefPtr mem);
+
+int qemuSecurityRestoreMemoryLabel(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ virDomainMemoryDefPtr mem);
+
/* Please note that for these APIs there is no wrapper yet. Do NOT blindly add
* new APIs here. If an API can touch a /dev file add a proper wrapper instead.
*/