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

Reply via email to