On Fri, Aug 16, 2019 at 5:39 PM Erik Skultety <eskultet(a)redhat.com> wrote:
...
> +
> + if (operation == TEST_DEVICE_DETACH)
> + parse_flags |= VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE;
^This should be added by patch 3/5
> +
> + if (xml) {
> + if (!(dev = virDomainDeviceDefParse(xml, def,
> + driver->caps, driver->xmlopt,
> + NULL, parse_flags)))
> + goto cleanup;
> + } else if (alias) {
> + if (VIR_ALLOC(dev) < 0 || virDomainDefFindDevice(def, alias, dev, true)
< 0)
> + goto cleanup;
> + }
> +
> + switch (operation) {
> + case TEST_DEVICE_ATTACH:
> + if (testDomainAttachDeviceLiveAndConfig(def, dev) < 0)
> + goto cleanup;
> + break;
> + case TEST_DEVICE_DETACH:
> + break;
> + case TEST_DEVICE_UPDATE:
> + break;
> + }
> +
> + ret = 0;
> + cleanup:
> + if (xml)
> + virDomainDeviceDefFree(dev);
> + else
> + VIR_FREE(dev);
virDomainDeviceDefFree() can handle both cases.
It cannot! This got me as well and made me wonder!
Try attaching a device with an alias and then try detaching it with
virDomainDetachDeviceAlias and use virDomainDeviceDefFree to free the
resource.
The program crashes with:
free(): double free detected in tcache 2
Ilias
Reviewed-by: Erik Skultety <eskultet(a)redhat.com>