I ran the OOM checking test suite again and uncovered a handful of pretty minor bugs - no crashers in real code - just forgetting to report OOM correctly
* src/datatypes.c: Convert to use the virReportErrorHelper macro instead of a static function, so we get correct function/line number info * src/domain_conf.c: Fix OOM handling in virXPathNodeSet() call so it reports OOM error, instead of ignoring * src/nodeinfo.c: Use _(...) for error message strings * src/xend_internal.c: Add missing check of virBufferError() func and report OOM error * tests/sexpr2xmltest.c: Reset error object between tests, free capabilities object, don't unref a NULL connection object * tests/testutils.c: Fix crash in OOM testing if single threaded * tests/xml2sexprtest.c: Reset error object between tests Daniel Index: src/datatypes.c =================================================================== RCS file: /data/cvs/libvirt/src/datatypes.c,v retrieving revision 1.9 diff -u -p -r1.9 datatypes.c --- src/datatypes.c 29 Jan 2009 12:10:32 -0000 1.9 +++ src/datatypes.c 30 Mar 2009 11:47:05 -0000 @@ -28,31 +28,15 @@ #define VIR_FROM_THIS VIR_FROM_NONE +#define virLibConnError(conn, code, fmt...) \ + virReportErrorHelper(conn, VIR_FROM_THIS, code, __FILE__, \ + __FUNCTION__, __LINE__, fmt) + /************************************************************************ * * * Domain and Connections allocations * * * ************************************************************************/ -/** - * virLibConnError: - * @conn: the connection if available - * @error: the error number - * @info: extra information string - * - * Handle an error at the connection level - */ -static void -virLibConnError(virConnectPtr conn, virErrorNumber error, const char *info) -{ - const char *errmsg; - - if (error == VIR_ERR_OK) - return; - - errmsg = virErrorMsg(error, info); - virRaiseError(conn, NULL, NULL, VIR_FROM_NONE, error, VIR_ERR_ERROR, - errmsg, info, NULL, 0, 0, errmsg, info); -} /** * virDomainFreeName: Index: src/domain_conf.c =================================================================== RCS file: /data/cvs/libvirt/src/domain_conf.c,v retrieving revision 1.72 diff -u -p -r1.72 domain_conf.c --- src/domain_conf.c 24 Mar 2009 11:16:29 -0000 1.72 +++ src/domain_conf.c 30 Mar 2009 11:47:05 -0000 @@ -2068,7 +2068,10 @@ static virDomainDefPtr virDomainDefParse VIR_FREE(tmp); } - if ((n = virXPathNodeSet(conn, "./features/*", ctxt, &nodes)) > 0) { + n = virXPathNodeSet(conn, "./features/*", ctxt, &nodes); + if (n < 0) + goto error; + if (n) { for (i = 0 ; i < n ; i++) { int val = virDomainFeatureTypeFromString((const char *)nodes[i]->name); if (val < 0) { @@ -2079,8 +2082,8 @@ static virDomainDefPtr virDomainDefParse } def->features |= (1 << val); } + VIR_FREE(nodes); } - VIR_FREE(nodes); if (virDomainLifecycleParseXML(conn, ctxt, "string(./on_reboot[1])", &def->onReboot, VIR_DOMAIN_LIFECYCLE_RESTART) < 0) Index: src/nodeinfo.c =================================================================== RCS file: /data/cvs/libvirt/src/nodeinfo.c,v retrieving revision 1.17 diff -u -p -r1.17 nodeinfo.c --- src/nodeinfo.c 20 Jan 2009 17:13:33 -0000 1.17 +++ src/nodeinfo.c 30 Mar 2009 11:47:05 -0000 @@ -74,8 +74,8 @@ int linuxNodeInfoCPUPopulate(virConnectP buf++; if (*buf != ':') { virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR, - VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, - "parsing cpuinfo processor"); + VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, + "%s", _("parsing cpuinfo processor")); return -1; } nodeinfo->cpus++; @@ -87,8 +87,8 @@ int linuxNodeInfoCPUPopulate(virConnectP buf++; if (*buf != ':' || !buf[1]) { virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR, - VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, - "parsing cpuinfo cpu MHz"); + VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, + "%s", _("parsing cpuinfo cpu MHz")); return -1; } if (virStrToLong_ui(buf+1, &p, 10, &ui) == 0 @@ -103,8 +103,8 @@ int linuxNodeInfoCPUPopulate(virConnectP buf++; if (*buf != ':' || !buf[1]) { virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR, - VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, - "parsing cpuinfo cpu cores %c", *buf); + VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, + "parsing cpuinfo cpu cores %c", *buf); return -1; } if (virStrToLong_ui(buf+1, &p, 10, &id) == 0 @@ -116,8 +116,8 @@ int linuxNodeInfoCPUPopulate(virConnectP if (!nodeinfo->cpus) { virRaiseError(conn, NULL, NULL, 0, VIR_ERR_INTERNAL_ERROR, - VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, - "no cpus found"); + VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0, + "%s", _("no cpus found")); return -1; } Index: src/xend_internal.c =================================================================== RCS file: /data/cvs/libvirt/src/xend_internal.c,v retrieving revision 1.253 diff -u -p -r1.253 xend_internal.c --- src/xend_internal.c 10 Mar 2009 11:13:32 -0000 1.253 +++ src/xend_internal.c 30 Mar 2009 11:47:06 -0000 @@ -5540,6 +5540,11 @@ xenDaemonFormatSxpr(virConnectPtr conn, virBufferAddLit(&buf, ")"); /* closes (vm */ + if (virBufferError(&buf)) { + virReportOOMError(conn); + return NULL; + } + return virBufferContentAndReset(&buf); error: Index: tests/sexpr2xmltest.c =================================================================== RCS file: /data/cvs/libvirt/tests/sexpr2xmltest.c,v retrieving revision 1.36 diff -u -p -r1.36 sexpr2xmltest.c --- tests/sexpr2xmltest.c 29 Jan 2009 17:02:00 -0000 1.36 +++ tests/sexpr2xmltest.c 30 Mar 2009 11:47:06 -0000 @@ -64,7 +64,8 @@ static int testCompareFiles(const char * fail: free(gotxml); virDomainDefFree(def); - virUnrefConnect(conn); + if (conn) + virUnrefConnect(conn); return ret; } @@ -115,6 +116,7 @@ mymain(int argc, char **argv) #define DO_TEST(in, out, version) \ do { \ struct testInfo info = { in, out, version }; \ + virResetLastError(); \ if (virtTestRun("Xen SEXPR-2-XML " in " -> " out, \ 1, testCompareHelper, &info) < 0) \ ret = -1; \ @@ -163,6 +165,8 @@ mymain(int argc, char **argv) DO_TEST("fv-sound", "fv-sound", 1); DO_TEST("fv-sound-all", "fv-sound-all", 1); + virCapabilitiesFree(caps); + return(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE); } Index: tests/testutils.c =================================================================== RCS file: /data/cvs/libvirt/tests/testutils.c,v retrieving revision 1.26 diff -u -p -r1.26 testutils.c --- tests/testutils.c 2 Feb 2009 20:35:14 -0000 1.26 +++ tests/testutils.c 30 Mar 2009 11:47:06 -0000 @@ -409,7 +435,8 @@ int virtTestMain(int argc, /* Run once for each alloc, failing a different one and validating that the test case failed */ for (n = 0; n < approxAlloc && (!mp || worker) ; n++) { - if ((n % mp) != (worker - 1)) + if (mp && + (n % mp) != (worker - 1)) continue; if (!testDebug) { if (mp) Index: tests/xml2sexprtest.c =================================================================== RCS file: /data/cvs/libvirt/tests/xml2sexprtest.c,v retrieving revision 1.34 diff -u -p -r1.34 xml2sexprtest.c --- tests/xml2sexprtest.c 23 Jan 2009 01:48:47 -0000 1.34 +++ tests/xml2sexprtest.c 30 Mar 2009 11:47:06 -0000 @@ -95,6 +95,7 @@ mymain(int argc, char **argv) #define DO_TEST(in, out, name, version) \ do { \ struct testInfo info = { in, out, name, version }; \ + virResetLastError(); \ if (virtTestRun("Xen XML-2-SEXPR " in " -> " out, \ 1, testCompareHelper, &info) < 0) \ ret = -1; \ -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list