[PATCH 0/9] bhyve: A couple of memleak fixes
*** BLURB HERE *** Michal Prívozník (9): bhyve: Avoid memleak in bhyveParsePassthru() bhyve: Avoid leaking @addrs in bhyveDomainAssignPCIAddresses() bhyve_command: Avoid leaking @buf in virBhyveProcessBuildBhyveCmd() bhyve_command: Avoid memleak in bhyveBuildNetArgStr() bhyvexml2argvmock: Provide virCPUProbeHost() bhyvexml2argvtest: Avoid leaking driver caps bhyvexml2argvtest: Don't leak parts of driver config bhyvexml2argvtest: Avoid leaking firmwareDir bhyvexml2xmltest: Avoid leaking driver caps src/bhyve/bhyve_command.c | 26 ++++++++++++-------------- src/bhyve/bhyve_device.c | 10 +++++++--- src/bhyve/bhyve_parse_command.c | 2 +- tests/bhyvexml2argvmock.c | 8 ++++++++ tests/bhyvexml2argvtest.c | 10 +++++++--- tests/bhyvexml2xmltest.c | 1 + 6 files changed, 36 insertions(+), 21 deletions(-) -- 2.52.0
From: Michal Privoznik <mprivozn@redhat.com> The aim of bhyveParsePassthru() is to parse PCI address from bhyve command line. The PCI address might be of a form bus:slot:function or bus/slot/function. If the former isn't found the latter is parsed (both using g_strsplit()). But after the first call, g_strsplit() just returns a string list containing but the whole input duplicated. Therefore, calling plain g_free() is not enough, the array must be freed too. 6 bytes in 1 blocks are definitely lost in loss record 1 of 325 at 0x4863224: malloc (vg_replace_malloc.c:451) by 0x4EC6562: g_malloc (in /usr/local/lib/libglib-2.0.so.0.8400.4) by 0x4EE28D9: g_strsplit (in /usr/local/lib/libglib-2.0.so.0.8400.4) by 0x4011297: bhyveParsePassthru (bhyve_parse_command.c:699) by 0x4010082: bhyveParseBhyvePCIArg (bhyve_parse_command.c:800) by 0x400EE14: bhyveParseBhyveCommandLine (bhyve_parse_command.c:862) by 0x400DF9C: bhyveParseCommandLineString (bhyve_parse_command.c:1058) by 0x4008CA0: testCompareXMLToArgvFiles (bhyveargv2xmltest.c:39) by 0x4008B29: testCompareXMLToArgvHelper (bhyveargv2xmltest.c:105) by 0x4009288: virTestRun (testutils.c:143) by 0x40085AC: mymain (bhyveargv2xmltest.c:164) by 0x400B582: virTestMain (testutils.c:913) Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/bhyve/bhyve_parse_command.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bhyve/bhyve_parse_command.c b/src/bhyve/bhyve_parse_command.c index 8b405206bd..3d9a6f3964 100644 --- a/src/bhyve/bhyve_parse_command.c +++ b/src/bhyve/bhyve_parse_command.c @@ -701,7 +701,7 @@ bhyveParsePassthru(virDomainDef *def G_GNUC_UNUSED, goto error; } if (g_str_equal(addr, *params)) { - g_free(params); + g_strfreev(params); if (!(params = g_strsplit(addr, "/", -1))) { virReportError(VIR_ERR_OPERATION_FAILED, _("Failed to parse PCI address %1$s"), addr); goto error; -- 2.52.0
From: Michal Privoznik <mprivozn@redhat.com> Inside of bhyveDomainAssignPCIAddresses() the @addr variable is allocated and in a few cases stolen into domain private data. But in all other cases the associated memory is never freed. 12,800 (3,200 direct, 9,600 indirect) bytes in 100 blocks are definitely lost in loss record 533 of 538 at 0x4888098: calloc (vg_replace_malloc.c:1682) by 0x4EE67D9: g_malloc0_n (in /usr/local/lib/libglib-2.0.so.0.8400.4) by 0x4AFD4AC: virDomainPCIAddressSetAlloc (domain_addr.c:1011) by 0x4020F68: bhyveDomainPCIAddressSetCreate (bhyve_device.c:65) by 0x40210BD: bhyveDomainAssignPCIAddresses (bhyve_device.c:219) by 0x402180C: bhyveDomainAssignAddresses (bhyve_device.c:241) by 0x4020083: bhyveDomainDefAssignAddresses (bhyve_domain.c:230) by 0x4B71820: virDomainDefPostParse (domain_postparse.c:1503) by 0x4B28282: virDomainDefParseNode (domain_conf.c:20565) by 0x4B2810B: virDomainDefParse (domain_conf.c:20502) by 0x4B281DF: virDomainDefParseFile (domain_conf.c:20549) by 0x4015D6B: testCompareXMLToArgvFiles (bhyvexml2argvtest.c:47) Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/bhyve/bhyve_device.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/bhyve/bhyve_device.c b/src/bhyve/bhyve_device.c index 28a9c82d7b..54511383bb 100644 --- a/src/bhyve/bhyve_device.c +++ b/src/bhyve/bhyve_device.c @@ -215,25 +215,29 @@ int bhyveDomainAssignPCIAddresses(virDomainDef *def, { virDomainPCIAddressSet *addrs = NULL; bhyveDomainObjPrivate *priv = NULL; + int ret = -1; if (!(addrs = bhyveDomainPCIAddressSetCreate(def, 1))) return -1; if (bhyveAssignDevicePCISlots(def, addrs) < 0) - return -1; + goto cleanup; if (obj && obj->privateData) { priv = obj->privateData; if (addrs) { virDomainPCIAddressSetFree(priv->pciaddrs); priv->persistentAddrs = 1; - priv->pciaddrs = addrs; + priv->pciaddrs = g_steal_pointer(&addrs); } else { priv->persistentAddrs = 0; } } - return 0; + ret = 0; + cleanup: + virDomainPCIAddressSetFree(addrs); + return ret; } int bhyveDomainAssignAddresses(virDomainDef *def, virDomainObj *obj) -- 2.52.0
From: Michal Privoznik <mprivozn@redhat.com> When building OS loader part of bhyve command line, there's @buf declared and it is even correctly annotated with g_auto() to be freed automatically. But then, the buffer contents is appended onto the command line using virBufferContentAndReset() which leads to a memleak because the buffer is reset. It's virBufferCurrentContent() that should have been used instead. 128 bytes in 1 blocks are definitely lost in loss record 476 of 536 at 0x48882B1: realloc (vg_replace_malloc.c:1810) by 0x4EE6622: g_realloc (in /usr/local/lib/libglib-2.0.so.0.8400.4) by 0x4F048BC: g_string_new (in /usr/local/lib/libglib-2.0.so.0.8400.4) by 0x4A59E1E: virBufferInitialize (virbuffer.c:121) by 0x4A5A63C: virBufferVasprintf (virbuffer.c:321) by 0x4A5A5DE: virBufferAsprintf (virbuffer.c:303) by 0x401B22F: virBhyveProcessBuildBhyveCmd (bhyve_command.c:1021) by 0x4015F05: testCompareXMLToArgvFiles (bhyvexml2argvtest.c:72) by 0x4015BA9: testCompareXMLToArgvHelper (bhyvexml2argvtest.c:144) by 0x4016588: virTestRun (testutils.c:143) by 0x4015919: mymain (bhyvexml2argvtest.c:341) by 0x4018882: virTestMain (testutils.c:913) Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/bhyve/bhyve_command.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c index a45a5d1c33..c9bfe22c8c 100644 --- a/src/bhyve/bhyve_command.c +++ b/src/bhyve/bhyve_command.c @@ -1003,7 +1003,7 @@ virBhyveProcessBuildBhyveCmd(struct _bhyveConn *driver, virDomainDef *def, if (def->os.bootloader == NULL && def->os.loader) { virArch arch = def->os.arch; - g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; + g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; if (ARCH_IS_X86(arch)) { if ((bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_LPC_BOOTROM)) { @@ -1011,7 +1011,7 @@ virBhyveProcessBuildBhyveCmd(struct _bhyveConn *driver, virDomainDef *def, if (def->os.loader->nvram && def->os.loader->nvram->path) virBufferAsprintf(&buf, ",%s", def->os.loader->nvram->path); - virCommandAddArgList(cmd, "-l", virBufferContentAndReset(&buf), NULL); + virCommandAddArgList(cmd, "-l", virBufferCurrentContent(&buf), NULL); } else { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Installed bhyve binary does not support UEFI loader")); @@ -1019,7 +1019,7 @@ virBhyveProcessBuildBhyveCmd(struct _bhyveConn *driver, virDomainDef *def, } } else if (ARCH_IS_ARM(arch)) { virBufferAsprintf(&buf, "bootrom=%s", def->os.loader->path); - virCommandAddArgList(cmd, "-o", virBufferContentAndReset(&buf), NULL); + virCommandAddArgList(cmd, "-o", virBufferCurrentContent(&buf), NULL); } } -- 2.52.0
From: Michal Privoznik <mprivozn@redhat.com> Inside of bhyveBuildNetArgStr() there is @nic_model which is allocated, appended into cmd line and then freed under cleanup label. Firstly, There are few cases where instead of jumping onto the label there's a return statement (this alone can lead to a memory leak), but more importantly - the variable doesn't need dynamically allocated string. It's the same story with @brname. After making them both const strings, the return statements can be used more freely (up until first possible allocation). 6 bytes in 1 blocks are definitely lost in loss record 4 of 508 at 0x4883224: malloc (vg_replace_malloc.c:451) by 0x4EE6562: g_malloc (in /usr/local/lib/libglib-2.0.so.0.8400.4) by 0x4F0100F: g_strdup (in /usr/local/lib/libglib-2.0.so.0.8400.4) by 0x401BC02: g_strdup_inline (gstrfuncs.h:321) by 0x401BC02: bhyveBuildNetArgStr (bhyve_command.c:64) by 0x401B362: virBhyveProcessBuildBhyveCmd (bhyve_command.c:1033) by 0x4015F15: testCompareXMLToArgvFiles (bhyvexml2argvtest.c:72) by 0x4015BB9: testCompareXMLToArgvHelper (bhyvexml2argvtest.c:144) by 0x4016598: virTestRun (testutils.c:143) by 0x4015121: mymain (bhyvexml2argvtest.c:275) by 0x4018892: virTestMain (testutils.c:913) by 0x4013DC6: main (bhyvexml2argvtest.c:352) Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/bhyve/bhyve_command.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c index c9bfe22c8c..ff079da9ef 100644 --- a/src/bhyve/bhyve_command.c +++ b/src/bhyve/bhyve_command.c @@ -51,17 +51,17 @@ bhyveBuildNetArgStr(const virDomainDef *def, { char macaddr[VIR_MAC_STRING_BUFLEN]; char *realifname = NULL; - char *brname = NULL; - char *nic_model = NULL; + const char *brname = NULL; + const char *nic_model = NULL; int ret = -1; virDomainNetType actualType = virDomainNetGetActualType(net); g_autoptr(virConnect) netconn = NULL; if (net->model == VIR_DOMAIN_NET_MODEL_VIRTIO) { - nic_model = g_strdup("virtio-net"); + nic_model = "virtio-net"; } else if (net->model == VIR_DOMAIN_NET_MODEL_E1000) { if ((bhyveDriverGetBhyveCaps(driver) & BHYVE_CAP_NET_E1000) != 0) { - nic_model = g_strdup("e1000"); + nic_model = "e1000"; } else { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("NIC model 'e1000' is not supported by given bhyve binary")); @@ -75,9 +75,9 @@ bhyveBuildNetArgStr(const virDomainDef *def, if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) { if (!netconn && !(netconn = virGetConnectNetwork())) - goto cleanup; + return -1; if (virDomainNetAllocateActualDevice(netconn, def, net) < 0) - goto cleanup; + return -1; } /* final validation now that actual type is known */ if (virDomainActualNetDefValidate(net) < 0) @@ -88,11 +88,11 @@ bhyveBuildNetArgStr(const virDomainDef *def, switch (actualType) { case VIR_DOMAIN_NET_TYPE_NETWORK: case VIR_DOMAIN_NET_TYPE_BRIDGE: - brname = g_strdup(virDomainNetGetActualBridgeName(net)); + brname = virDomainNetGetActualBridgeName(net); if (!brname) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("No bridge name specified")); - goto cleanup; + return -1; } break; case VIR_DOMAIN_NET_TYPE_USER: @@ -116,7 +116,7 @@ bhyveBuildNetArgStr(const virDomainDef *def, virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Unsupported network type %1$s"), virDomainNetTypeToString(actualType)); - goto cleanup; + return -1; } if (!dryRun) { @@ -156,9 +156,7 @@ bhyveBuildNetArgStr(const virDomainDef *def, cleanup: if (ret < 0) VIR_FREE(net->ifname); - VIR_FREE(brname); VIR_FREE(realifname); - VIR_FREE(nic_model); return ret; } -- 2.52.0
From: Michal Privoznik <mprivozn@redhat.com> The bhyvexml2argvmock is loaded by bhyvexml2argvtest which calls virBhyveCapsBuild() which in turn calls virCPUProbeHost(). To make our test environment stable, it shouldn't depend on actual CPU and thus mocked implementation for virCPUProbeHost should be offered. Surprisingly, this is done in bhyveargv2xmlmock but not in bhyvexml2argvmock. Until now. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- tests/bhyvexml2argvmock.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/bhyvexml2argvmock.c b/tests/bhyvexml2argvmock.c index fe76564d51..7dbdd48682 100644 --- a/tests/bhyvexml2argvmock.c +++ b/tests/bhyvexml2argvmock.c @@ -8,6 +8,8 @@ #include "virnetdevtap.h" #include "virmock.h" #include "internal.h" +#include "cpu/cpu.h" +#include "testutilshostcpus.h" #define VIR_FROM_THIS VIR_FROM_BHYVE @@ -89,3 +91,9 @@ int bind(int sockfd G_GNUC_UNUSED, { return 0; } + +virCPUDef * +virCPUProbeHost(virArch arch) +{ + return testUtilsHostCpusGetDefForArch(arch); +} -- 2.52.0
From: Michal Privoznik <mprivozn@redhat.com> Driver capabilities are allocated at the beginning of mymain(), but roughly in the middle the architecture is switched to aarch64 and capabilities are constructed again. Without freeing the old ones. 1,583 (288 direct, 1,295 indirect) bytes in 1 blocks are definitely lost in loss record 520 of 536 at 0x4888098: calloc (vg_replace_malloc.c:1682) by 0x4EE65CA: g_malloc0 (in /usr/local/lib/libglib-2.0.so.0.8400.4) by 0x53344B8: g_type_create_instance (in /usr/local/lib/libgobject-2.0.so.0.8400.4) by 0x531D263: ??? (in /usr/local/lib/libgobject-2.0.so.0.8400.4) by 0x531C75E: g_object_new (in /usr/local/lib/libgobject-2.0.so.0.8400.4) by 0x4AAC806: virObjectNew (virobject.c:252) by 0x4AF366A: virCapabilitiesNew (capabilities.c:87) by 0x401998B: virBhyveCapsBuild (bhyve_capabilities.c:51) by 0x4013E93: mymain (bhyvexml2argvtest.c:155) by 0x4018882: virTestMain (testutils.c:913) by 0x4013DC6: main (bhyvexml2argvtest.c:351) Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- tests/bhyvexml2argvtest.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index c7c18c3690..51273295b5 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -331,6 +331,7 @@ mymain(void) DO_TEST("bhyveload-timeout"); /* arm64 tests */ + virObjectUnref(driver.caps); virTestSetHostArch(VIR_ARCH_AARCH64); driver.caps = virBhyveCapsBuild(); /* bhyve does not support UTC clock on ARM */ -- 2.52.0
From: Michal Privoznik <mprivozn@redhat.com> At the beginning of mymain() the virBhyveDriverConfigNew() is called which inits driver config with some paths. These are then overwritten to produce stable test output. Well, the old ones should be freed first. 128 bytes in 1 blocks are definitely lost in loss record 453 of 508 at 0x4883224: malloc (vg_replace_malloc.c:451) by 0x506BD16: vasprintf_l (in /lib/libc.so.7) by 0x4F39073: g_vasprintf (in /usr/local/lib/libglib-2.0.so.0.8400.4) by 0x4F01288: g_strdup_printf (in /usr/local/lib/libglib-2.0.so.0.8400.4) by 0x401F75B: virBhyveDriverConfigNew (bhyve_conf.c:62) by 0x4013FAA: mymain (bhyvexml2argvtest.c:164) by 0x4018892: virTestMain (testutils.c:913) by 0x4013DC6: main (bhyvexml2argvtest.c:352) 25 bytes in 1 blocks are definitely lost in loss record 206 of 508 at 0x4883224: malloc (vg_replace_malloc.c:451) by 0x4EE6562: g_malloc (in /usr/local/lib/libglib-2.0.so.0.8400.4) by 0x4F0100F: g_strdup (in /usr/local/lib/libglib-2.0.so.0.8400.4) by 0x401F715: g_strdup_inline (gstrfuncs.h:321) by 0x401F715: virBhyveDriverConfigNew (bhyve_conf.c:60) by 0x4013FAA: mymain (bhyvexml2argvtest.c:164) by 0x4018892: virTestMain (testutils.c:913) by 0x4013DC6: main (bhyvexml2argvtest.c:352) Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- tests/bhyvexml2argvtest.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index 51273295b5..8f078f9d78 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -164,8 +164,10 @@ mymain(void) if (!(driver.config = virBhyveDriverConfigNew())) return EXIT_FAILURE; - driver.config->firmwareDir = fakefirmwaredir; - driver.config->nvramDir = fakenvramdir; + VIR_FREE(driver.config->firmwareDir); + VIR_FREE(driver.config->nvramDir); + driver.config->firmwareDir = g_steal_pointer(&fakefirmwaredir); + driver.config->nvramDir = g_steal_pointer(&fakenvramdir); driver.config->bhyveloadTimeout = 0; driver.config->bhyveloadTimeoutKill = 0; -- 2.52.0
From: Michal Privoznik <mprivozn@redhat.com> The firmwareDir member of driver config is set at the beginning of mymain(). But then, roughly in the middle of test cases it is overwritten to fakefirmwareemptydir. But this means the old value must be freed. Or reassigned back to its original variable which is freed automatically. 16 bytes in 1 blocks are definitely lost in loss record 190 of 505 at 0x4883224: malloc (vg_replace_malloc.c:451) by 0x4EE6562: g_malloc (in /usr/local/lib/libglib-2.0.so.0.8400.4) by 0x4F0100F: g_strdup (in /usr/local/lib/libglib-2.0.so.0.8400.4) by 0x4013E26: g_strdup_inline (gstrfuncs.h:321) by 0x4013E26: mymain (bhyvexml2argvtest.c:151) by 0x40189A2: virTestMain (testutils.c:913) by 0x4013DE6: main (bhyvexml2argvtest.c:354) Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- tests/bhyvexml2argvtest.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index 8f078f9d78..ae43445cde 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -249,7 +249,8 @@ mymain(void) DO_TEST("isa-controller"); DO_TEST_FAILURE("isa-multiple-controllers"); DO_TEST("firmware-efi"); - driver.config->firmwareDir = fakefirmwareemptydir; + fakefirmwaredir = g_steal_pointer(&driver.config->firmwareDir); + driver.config->firmwareDir = g_steal_pointer(&fakefirmwareemptydir); DO_TEST_PREPARE_ERROR("firmware-efi"); DO_TEST("fs-9p"); DO_TEST("fs-9p-readonly"); -- 2.52.0
From: Michal Privoznik <mprivozn@redhat.com> Driver capabilities are allocated at the beginning of mymain(), but roughly in the middle the architecture is switched to aarch64 and capabilities are constructed again. Without freeing the old ones. 704 (288 direct, 416 indirect) bytes in 1 blocks are definitely lost in loss record 328 of 332 at 0x4885098: calloc (vg_replace_malloc.c:1682) by 0x4EE35CA: g_malloc0 (in /usr/local/lib/libglib-2.0.so.0.8400.4) by 0x53314B8: g_type_create_instance (in /usr/local/lib/libgobject-2.0.so.0.8400.4) by 0x531A263: ??? (in /usr/local/lib/libgobject-2.0.so.0.8400.4) by 0x531975E: g_object_new (in /usr/local/lib/libgobject-2.0.so.0.8400.4) by 0x4AA9AB6: virObjectNew (virobject.c:252) by 0x4AF0BBA: virCapabilitiesNew (capabilities.c:87) by 0x401797B: virBhyveCapsBuild (bhyve_capabilities.c:51) by 0x4012F57: mymain (bhyvexml2xmltest.c:60) by 0x4016872: virTestMain (testutils.c:913) Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- tests/bhyvexml2xmltest.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/bhyvexml2xmltest.c b/tests/bhyvexml2xmltest.c index 5df1f2b6ba..9e3bd6c45f 100644 --- a/tests/bhyvexml2xmltest.c +++ b/tests/bhyvexml2xmltest.c @@ -144,6 +144,7 @@ mymain(void) /* USB xhci tablet */ DO_TEST_DIFFERENT("input-xhci-tablet"); + virObjectUnref(driver.caps); virTestSetHostArch(VIR_ARCH_AARCH64); driver.caps = virBhyveCapsBuild(); /* bhyve does not support UTC clock on ARM */ -- 2.52.0
Michal Privoznik via Devel wrote:
*** BLURB HERE ***
Michal Prívozník (9): bhyve: Avoid memleak in bhyveParsePassthru() bhyve: Avoid leaking @addrs in bhyveDomainAssignPCIAddresses() bhyve_command: Avoid leaking @buf in virBhyveProcessBuildBhyveCmd() bhyve_command: Avoid memleak in bhyveBuildNetArgStr() bhyvexml2argvmock: Provide virCPUProbeHost() bhyvexml2argvtest: Avoid leaking driver caps bhyvexml2argvtest: Don't leak parts of driver config bhyvexml2argvtest: Avoid leaking firmwareDir bhyvexml2xmltest: Avoid leaking driver caps
src/bhyve/bhyve_command.c | 26 ++++++++++++-------------- src/bhyve/bhyve_device.c | 10 +++++++--- src/bhyve/bhyve_parse_command.c | 2 +- tests/bhyvexml2argvmock.c | 8 ++++++++ tests/bhyvexml2argvtest.c | 10 +++++++--- tests/bhyvexml2xmltest.c | 1 + 6 files changed, 36 insertions(+), 21 deletions(-)
Reviewed-by: Roman Bogorodskiy <bogorodskiy@gmail.com> Thanks for taking care of that!
-- 2.52.0
participants (2)
-
Michal Privoznik -
Roman Bogorodskiy