Changeset: bc220a69ebfe for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bc220a69ebfe Modified Files: monetdb5/modules/atoms/batxml.c Branch: Jan2014 Log Message:
Close resource leak. diffs (147 lines): diff --git a/monetdb5/modules/atoms/batxml.c b/monetdb5/modules/atoms/batxml.c --- a/monetdb5/modules/atoms/batxml.c +++ b/monetdb5/modules/atoms/batxml.c @@ -77,11 +77,12 @@ batxml_export str AGGRsubxmlcand(bat *re batxml_export str AGGRsubxml(bat *retval, bat *bid, bat *gid, bat *eid, bit *skip_nils); -#define prepareResult(X,Y,tpe,Z) \ +#define prepareResult(X,Y,tpe,Z,free) \ (X) = BATnew((Y)->htype, (tpe), BATcount(Y)); \ if ((X) == NULL) { \ BBPreleaseref((Y)->batCacheid); \ - throw(MAL, "xml." Z, MAL_MALLOC_FAIL); \ + free; \ + throw(MAL, "xml." Z, MAL_MALLOC_FAIL); \ } \ if ((Y)->htype == TYPE_void) \ BATseqbase((X), (Y)->hseqbase); \ @@ -108,7 +109,7 @@ BATXMLxml2str(bat *ret, const bat *bid) if ((b = BATdescriptor(*bid)) == NULL) throw(MAL, "xml.str", INTERNAL_BAT_ACCESS); - prepareResult(bn, b, TYPE_str, "str"); + prepareResult(bn, b, TYPE_str, "str", (void) 0); bi = bat_iterator(b); BATloop(b, p, q) { const void *h = (const void *) BUNhead(bi, p); @@ -145,7 +146,7 @@ BATXMLxmltext(bat *ret, const bat *bid) if ((b = BATdescriptor(*bid)) == NULL) throw(MAL, "xml.text", INTERNAL_BAT_ACCESS); - prepareResult(bn, b, TYPE_str, "text"); + prepareResult(bn, b, TYPE_str, "text", (void) 0); bi = bat_iterator(b); BATloop(b, p, q) { const void *h = (const void *) BUNhead(bi, p); @@ -255,7 +256,7 @@ BATXMLstr2xml(bat *ret, const bat *bid) GDKfree(buf); throw(MAL, "xml.xml", INTERNAL_BAT_ACCESS); } - prepareResult(bn, b, TYPE_xml, "xml"); + prepareResult(bn, b, TYPE_xml, "xml", GDKfree(buf)); bi = bat_iterator(b); BATloop(b, p, q) { const void *h = (const void *) BUNhead(bi, p); @@ -309,7 +310,7 @@ BATXMLdocument(bat *ret, const bat *bid) GDKfree(buf); throw(MAL, "xml.document", INTERNAL_BAT_ACCESS); } - prepareResult(bn, b, TYPE_xml, "document"); + prepareResult(bn, b, TYPE_xml, "document", GDKfree(buf)); bi = bat_iterator(b); BATloop(b, p, q) { const void *h = (const void *) BUNhead(bi, p); @@ -375,7 +376,7 @@ BATXMLcontent(bat *ret, const bat *bid) } doc = xmlParseMemory("<doc/>", 6); root = xmlDocGetRootElement(doc); - prepareResult(bn, b, TYPE_xml, "content"); + prepareResult(bn, b, TYPE_xml, "content", GDKfree(buf)); bi = bat_iterator(b); xbuf = xmlBufferCreate(); BATloop(b, p, q) { @@ -439,7 +440,7 @@ BATXMLisdocument(bat *ret, const bat *bi if ((b = BATdescriptor(*bid)) == NULL) throw(MAL, "xml.isdocument", INTERNAL_BAT_ACCESS); - prepareResult(bn, b, TYPE_bit, "isdocument"); + prepareResult(bn, b, TYPE_bit, "isdocument", (void) 0); bi = bat_iterator(b); BATloop(b, p, q) { const void *h = (const void *) BUNhead(bi, p); @@ -504,7 +505,7 @@ BATXMLoptions(bat *ret, const char * con GDKfree(buf); throw(MAL, "xml.options", INTERNAL_BAT_ACCESS); } - prepareResult(bn, b, TYPE_xml, "options"); + prepareResult(bn, b, TYPE_xml, "options", GDKfree(val); GDKfree(buf)); if (strcmp(*options, "absent") == 0) buf[0] = 0; @@ -571,7 +572,7 @@ BATXMLcomment(bat *ret, const bat *bid) GDKfree(buf); throw(MAL, "xml.comment", INTERNAL_BAT_ACCESS); } - prepareResult(bn, b, TYPE_xml, "comment"); + prepareResult(bn, b, TYPE_xml, "comment", GDKfree(buf)); bi = bat_iterator(b); BATloop(b, p, q) { const void *h = (const void *) BUNhead(bi, p); @@ -646,7 +647,7 @@ BATXMLpi(bat *ret, const char * const *t GDKfree(buf); throw(MAL, "xml.pi", INTERNAL_BAT_ACCESS); } - prepareResult(bn, b, TYPE_xml, "pi"); + prepareResult(bn, b, TYPE_xml, "pi", GDKfree(buf)); bi = bat_iterator(b); BATloop(b, p, q) { const void *h = (const void *) BUNhead(bi, p); @@ -716,7 +717,7 @@ BATXMLroot(bat *ret, const bat *bid, con GDKfree(buf); throw(MAL, "xml.pi", INTERNAL_BAT_ACCESS); } - prepareResult(bn, b, TYPE_xml, "pi"); + prepareResult(bn, b, TYPE_xml, "pi", GDKfree(buf)); bi = bat_iterator(b); BATloop(b, p, q) { const void *h = (const void *) BUNhead(bi, p); @@ -793,7 +794,7 @@ BATXMLattribute(bat *ret, const char * c GDKfree(buf); throw(MAL, "xml.attribute", INTERNAL_BAT_ACCESS); } - prepareResult(bn, b, TYPE_xml, "attribute"); + prepareResult(bn, b, TYPE_xml, "attribute", GDKfree(buf)); bi = bat_iterator(b); BATloop(b, p, q) { const void *h = (const void *) BUNhead(bi, p); @@ -871,7 +872,7 @@ BATXMLelement(bat *ret, const char * con GDKfree(buf); throw(MAL, "xml.element", INTERNAL_BAT_ACCESS); } - prepareResult(bn, b, TYPE_xml, "element"); + prepareResult(bn, b, TYPE_xml, "element", GDKfree(buf)); bi = bat_iterator(b); BATloop(b, p, q) { const void *h = (const void *) BUNhead(bi, p); @@ -979,7 +980,9 @@ BATXMLforest(Client cntxt, MalBlkPtr mb, throw(MAL, "xml.forest", INTERNAL_BAT_ACCESS); } - prepareResult(bn, bi[pci->retc].b, TYPE_xml, "forest"); + prepareResult(bn, bi[pci->retc].b, TYPE_xml, "forest", + for (i = pci->retc; i < pci->argc; i++) BBPunfix(bi[i].b->batCacheid); + GDKfree(bi); GDKfree(p); GDKfree(q); GDKfree(buf)); while (p[pci->retc] < q[pci->retc]) { const char *t; @@ -1072,7 +1075,8 @@ BATXMLconcat(bat *ret, const bat *bid, c q = BUNlast(b); rp = BUNfirst(r); - prepareResult(bn, b, TYPE_xml, "concat"); + prepareResult(bn, b, TYPE_xml, "concat", + GDKfree(buf); BBPunfix(r->batCacheid)); bi = bat_iterator(b); ri = bat_iterator(r); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list