From: Michal Privoznik Date: Mon, 2 Feb 2026 14:36:37 +0000 (+0100) Subject: bhyve: Avoid memleak in bhyveParsePassthru() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1779a8600f1899c03ecd8bdcb772a37be2b3e345;p=thirdparty%2Flibvirt.git bhyve: Avoid memleak in bhyveParsePassthru() 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 Reviewed-by: Roman Bogorodskiy --- 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;