Changeset: bd1012b6cd14 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bd1012b6cd14
Modified Files:
        gdk/gdk_bat.c
        gdk/gdk_heap.c
        gdk/gdk_logger.c
        geom/monetdb5/geom.c
        geom/monetdb5/geom_upgrade.c
        monetdb5/mal/mal_builder.c
        monetdb5/mal/mal_client.c
        monetdb5/mal/mal_dataflow.c
        monetdb5/mal/mal_exception.c
        monetdb5/mal/mal_import.c
        monetdb5/mal/mal_instruction.c
        monetdb5/mal/mal_linker.c
        monetdb5/mal/mal_listing.c
        monetdb5/mal/mal_resolve.c
        monetdb5/mal/mal_runtime.c
        monetdb5/mal/mal_session.c
        monetdb5/modules/atoms/batxml.c
        monetdb5/modules/atoms/blob.c
        monetdb5/modules/atoms/color.c
        monetdb5/modules/atoms/identifier.c
        monetdb5/modules/atoms/inet.c
        monetdb5/modules/atoms/mtime.c
        monetdb5/modules/atoms/str.c
        monetdb5/modules/atoms/streams.c
        monetdb5/modules/atoms/url.c
        monetdb5/modules/atoms/uuid.c
        monetdb5/modules/atoms/xml.c
        monetdb5/modules/mal/mal_io.c
        monetdb5/modules/mal/mal_mapi.c
        monetdb5/modules/mal/pcre.c
        monetdb5/modules/mal/remote.c
        monetdb5/modules/mal/tablet.c
        monetdb5/modules/mal/txtsim.c
        monetdb5/optimizer/opt_emptybind.c
        monetdb5/optimizer/opt_evaluate.c
        monetdb5/optimizer/opt_macro.c
        monetdb5/optimizer/opt_mergetable.c
        monetdb5/optimizer/opt_multiplex.c
        monetdb5/optimizer/opt_support.c
        monetdb5/scheduler/run_adder.c
        sql/backends/monet5/UDF/pyapi/convert_loops.h
        sql/backends/monet5/sql_execute.c
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_optimizer.c
        sql/backends/monet5/sql_scenario.c
        sql/backends/monet5/sql_upgrades.c
        sql/backends/monet5/sql_user.c
        sql/backends/monet5/vaults/bam/bam_export.c
        sql/backends/monet5/vaults/bam/bam_globals.h
        sql/backends/monet5/vaults/bam/bam_wrapper.c
        sql/common/sql_mem.c
        tools/merovingian/daemon/controlrunner.c
        tools/mserver/mserver5.c
Branch: Jul2017
Log Message:

Merge with Dec2016 branch.


diffs (truncated from 2007 to 300 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -289,7 +289,14 @@ BATattach(int tt, const char *heapfile, 
                while ((c = getc(f)) != EOF) {
                        if (n == m) {
                                m += 4096;
-                               p = GDKrealloc(p, m);
+                               s = GDKrealloc(p, m);
+                               if (s == NULL) {
+                                       GDKfree(p);
+                                       BBPreclaim(bn);
+                                       fclose(f);
+                                       return NULL;
+                               }
+                               p = s;
                                s = p + n;
                        }
                        if (c == '\n' && n > 0 && s[-1] == '\r') {
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -216,13 +216,13 @@ HEAPextend(Heap *h, size_t size, int may
                /* try GDKrealloc if the heap size stays within
                 * reasonable limits */
                if (!must_mmap) {
-                       void *p = h->base;
                        h->newstorage = h->storage = STORE_MEM;
                        h->base = GDKrealloc(h->base, size);
-                       HEAPDEBUG fprintf(stderr, "#HEAPextend: extending 
malloced heap " SZFMT " " SZFMT " " PTRFMT " " PTRFMT "\n", size, h->size, 
PTRFMTCAST p, PTRFMTCAST h->base);
+                       HEAPDEBUG fprintf(stderr, "#HEAPextend: extending 
malloced heap " SZFMT " " SZFMT " " PTRFMT " " PTRFMT "\n", size, h->size, 
PTRFMTCAST bak.base, PTRFMTCAST h->base);
                        h->size = size;
                        if (h->base)
                                return GDK_SUCCEED; /* success */
+                       /* bak.base is still valid and may get restored */
                        failure = "h->storage == STORE_MEM && !must_map && 
!h->base";
                }
                /* too big: convert it to a disk-based temporary heap */
@@ -631,7 +631,7 @@ HEAPload_intern(Heap *h, const char *nme
 {
        size_t minsize;
        int ret = 0;
-       char *srcpath, *dstpath;
+       char *srcpath, *dstpath, *tmp;
        int t0;
 
        h->storage = h->newstorage = h->size < 4 * GDK_mmap_pagesize ? 
STORE_MEM : STORE_MMAP;
@@ -678,7 +678,14 @@ HEAPload_intern(Heap *h, const char *nme
         * takes precedence. */
        srcpath = GDKfilepath(h->farmid, BATDIR, nme, ext);
        dstpath = GDKfilepath(h->farmid, BATDIR, nme, ext);
-       srcpath = GDKrealloc(srcpath, strlen(srcpath) + strlen(suffix) + 1);
+       if (srcpath == NULL ||
+           dstpath == NULL ||
+           (tmp = GDKrealloc(srcpath, strlen(srcpath) + strlen(suffix) + 1)) 
== NULL) {
+               GDKfree(srcpath);
+               GDKfree(dstpath);
+               return GDK_FAIL;
+       }
+       srcpath = tmp;
        strcat(srcpath, suffix);
 
        t0 = GDKms();
diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -1745,10 +1745,15 @@ dumpPointsPoint(BAT *idBAT, BAT *geomBAT
        int lvlDigitsNum = 10;  //MAX_UNIT = 4,294,967,295
        str err = MAL_SUCCEED;
 
+       if (pointWKB == NULL)
+               throw(MAL, "geom.Dump", MAL_MALLOC_FAIL);
+
        (*lvl)++;
        newPath = GDKmalloc(pathLength + lvlDigitsNum + 1);
-       if( newPath == NULL)
-               throw(MAL, "geom.PointsPoint", MAL_MALLOC_FAIL);
+       if (newPath == NULL) {
+               GDKfree(pointWKB);
+               throw(MAL, "geom.Dump", MAL_MALLOC_FAIL);
+       }
        sprintf(newPath, "%s%u", path, *lvl);
 
        if (BUNappend(idBAT, newPath, TRUE) != GDK_SUCCEED ||
@@ -1776,7 +1781,7 @@ dumpPointsLineString(BAT *idBAT, BAT *ge
        if (err != MAL_SUCCEED)
                return err;
 
-       for (i = 0; i < pointsNum; i++) {
+       for (i = 0; i < pointsNum && err == MAL_SUCCEED; i++) {
                GEOSGeometry *pointGeometry = GEOSGeomGetPointN(geosGeometry, 
i);
 
                if (pointGeometry == NULL)
@@ -1803,13 +1808,13 @@ dumpPointsPolygon(BAT *idBAT, BAT *geomB
 
        //get the exterior ring of the polygon
        exteriorRingGeometry = GEOSGetExteriorRing(geosGeometry);
-       if (!exteriorRingGeometry)
+       if (exteriorRingGeometry == NULL)
                throw(MAL, "geom.DumpPoints", "GEOSGetExteriorRing failed");
 
        (*lvl)++;
        newPath = GDKmalloc(pathLength + lvlDigitsNum + extraLength + 1);
-       if( newPath == NULL)
-               throw(MAL,"geom.dumpPointsPolygon",MAL_MALLOC_FAIL);
+       if (newPath == NULL)
+               throw(MAL, "geom.DumpPoints", MAL_MALLOC_FAIL);
        sprintf(newPath, "%s%u%s", path, *lvl, extraStr);
 
        //get the points in the exterior ring
@@ -1821,7 +1826,7 @@ dumpPointsPolygon(BAT *idBAT, BAT *geomB
        //check the interior rings
        numInteriorRings = GEOSGetNumInteriorRings(geosGeometry);
        if (numInteriorRings == -1)
-               throw(MAL, "geom.NumPoints", "GEOSGetNumInteriorRings failed");
+               throw(MAL, "geom.DumpPoints", "GEOSGetNumInteriorRings failed");
 
        // iterate over the interiorRing and transform each one of them
        for (i = 0; i < numInteriorRings; i++) {
@@ -1829,6 +1834,8 @@ dumpPointsPolygon(BAT *idBAT, BAT *geomB
                lvlDigitsNum = 10;      //MAX_UNIT = 4,294,967,295
 
                newPath = GDKmalloc(pathLength + lvlDigitsNum + extraLength + 
1);
+               if (newPath == NULL)
+                       throw(MAL, "geom.DumpPoints", MAL_MALLOC_FAIL);
                sprintf(newPath, "%s%u%s", path, *lvl, extraStr);
 
                err = dumpPointsLineString(idBAT, geomBAT, 
GEOSGetInteriorRingN(geosGeometry, i), newPath);
@@ -1862,8 +1869,8 @@ dumpPointsMultiGeometry(BAT *idBAT, BAT 
                lvl++;
 
                newPath = GDKmalloc(pathLength + lvlDigitsNum + extraLength + 
1);
-               if( newPath == NULL)
-                       throw(MAL,"geom.dumpPointsGeometry",MAL_MALLOC_FAIL);
+               if (newPath == NULL)
+                       throw(MAL, "geom.DumpPoints", MAL_MALLOC_FAIL);
                sprintf(newPath, "%s%u%s", path, lvl, extraStr);
 
                //*secondLevel = 0;
@@ -2171,8 +2178,8 @@ wkbFROMSTR_withSRID(char *geomWKT, int *
                size_t sizeOfInfo = strlen(geomWKT) - strlen(polyhedralSurface);
                geomWKT_original = geomWKT;
                geomWKT = GDKmalloc(sizeOfInfo + strlen(multiPolygon) + 1);
-               if( geomWKT == NULL)
-                       throw(MAL,"geomWKT",MAL_MALLOC_FAIL);
+               if (geomWKT == NULL)
+                       throw(MAL, "wkb.FromText", MAL_MALLOC_FAIL);
                strcpy(geomWKT, multiPolygon);
                memcpy(geomWKT + strlen(multiPolygon), 
&geomWKT_original[strlen(polyhedralSurface)], sizeOfInfo);
                geomWKT[sizeOfInfo + strlen(multiPolygon)] = '\0';
@@ -2180,13 +2187,23 @@ wkbFROMSTR_withSRID(char *geomWKT, int *
        ////////////////////////// UP TO HERE ///////////////////////////
 
        WKT_reader = GEOSWKTReader_create();
+       if (WKT_reader == NULL) {
+               if (geomWKT_original)
+                       GDKfree(geomWKT);
+               throw(MAL, "wkb.FromText", "GEOSWKTReader_create failed");
+       }
        geosGeometry = GEOSWKTReader_read(WKT_reader, geomWKT);
        GEOSWKTReader_destroy(WKT_reader);
 
-       if (geosGeometry == NULL)
+       if (geosGeometry == NULL) {
+               if (geomWKT_original)
+                       GDKfree(geomWKT);
                throw(MAL, "wkb.FromText", "GEOSWKTReader_read failed");
+       }
 
        if (GEOSGeomTypeId(geosGeometry) == -1) {
+               if (geomWKT_original)
+                       GDKfree(geomWKT);
                GEOSGeom_destroy(geosGeometry);
                throw(MAL, "wkb.FromText", "GEOSGeomTypeId failed");
        }
@@ -2199,8 +2216,11 @@ wkbFROMSTR_withSRID(char *geomWKT, int *
         * want to get the wkb out of it */
        *geomWKB = geos2wkb(geosGeometry);
        GEOSGeom_destroy(geosGeometry);
-       if (*geomWKB == NULL)
+       if (*geomWKB == NULL) {
+               if (geomWKT_original)
+                       GDKfree(geomWKT);
                throw(MAL, "wkb.FromText", "geos2wkb failed");
+       }
 
        *len = (int) wkb_size((*geomWKB)->len);
 
@@ -2227,10 +2247,8 @@ wkbaFROMSTR_withSRID(char *fromStr, int 
        memcpy(&items, fromStr, sizeof(int));
        skipBytes += sizeof(int);
        *toArray = GDKmalloc(wkba_size(items));
-       if( *toArray == NULL){
-               GDKerror("FROMSTR_withSRID" MAL_MALLOC_FAIL);
+       if (*toArray == NULL)
                return 0;
-       }
 
        for (i = 0; i < items; i++) {
                size_t parsedBytes;
@@ -4605,10 +4623,14 @@ wkbBox2D(mbr **box, wkb **point1, wkb **
        } else {
                //Assign the coordinates. Ensure that they are in correct order
                *box = GDKmalloc(sizeof(mbr));
-               (*box)->xmin = (float) (xmin < xmax ? xmin : xmax);
-               (*box)->ymin = (float) (ymin < ymax ? ymin : ymax);
-               (*box)->xmax = (float) (xmax > xmin ? xmax : xmin);
-               (*box)->ymax = (float) (ymax > ymin ? ymax : ymin);
+               if (*box == NULL) {
+                       err = createException(MAL, "geom.MakeBox2D", 
MAL_MALLOC_FAIL);
+               } else {
+                       (*box)->xmin = (float) (xmin < xmax ? xmin : xmax);
+                       (*box)->ymin = (float) (ymin < ymax ? ymin : ymax);
+                       (*box)->xmax = (float) (xmax > xmin ? xmax : xmin);
+                       (*box)->ymax = (float) (ymax > ymin ? ymax : ymin);
+               }
        }
        GEOSGeom_destroy(point1_geom);
        GEOSGeom_destroy(point2_geom);
@@ -5061,25 +5083,21 @@ wkbTOSTR(char **geomWKT, int *len, wkb *
        }
 
        if (wkt) {
-               if (*len < (int) dstStrLen + 1) {
+               if (*len < (int) dstStrLen + 1 || *geomWKT == NULL) {
                        *len = (int) dstStrLen + 1;
                        GDKfree(*geomWKT);
-                       *geomWKT = GDKmalloc(*len);
-                       if( *geomWKT == NULL){
-                               GDKerror("wkbTOSTR" MAL_MALLOC_FAIL);
+                       if ((*geomWKT = GDKmalloc(*len)) == NULL) {
+                               GEOSFree(wkt);
                                return 0;
                        }
                }
                snprintf(*geomWKT, *len, "\"%s\"", wkt);
                GEOSFree(wkt);
        } else {
-               if (*len < 4) {
+               if (*len < 4 || *geomWKT == NULL) {
                        GDKfree(*geomWKT);
-                       *geomWKT = GDKmalloc(*len = 4);
-                       if( *geomWKT == NULL){
-                               GDKerror("wkbTOSTR" MAL_MALLOC_FAIL);
+                       if ((*geomWKT = GDKmalloc(*len = 4)) == NULL)
                                return 0;
-                       }
                }
                strcpy(*geomWKT, "nil");
        }
@@ -5237,11 +5255,8 @@ mbrTOSTR(char **dst, int *len, mbr *atom
 
        if (*len < (int) dstStrLen + 1 || *dst == NULL) {
                GDKfree(*dst);
-               *dst = GDKmalloc(*len = (int) dstStrLen + 1);
-               if( *dst == NULL){
-                       GDKerror("mbrTOSTR" MAL_MALLOC_FAIL);
+               if ((*dst = GDKmalloc(*len = (int) dstStrLen + 1)) == NULL)
                        return 0;
-               }
        }
 
        if (dstStrLen > 3)
@@ -5279,14 +5294,10 @@ mbrFROMSTR(char *src, int *len, mbr **at
        } else if (!nil && (geosMbr = GEOSGeomFromWKT(src)) == NULL)
                return 0;
 
-       if (*len < (int) sizeof(mbr)) {
-               if (*atom)
-                       GDKfree(*atom);
-               *atom = GDKmalloc(*len = sizeof(mbr));
-               if( *atom == NULL){
-                       GDKerror("mbrFROMSTR" MAL_MALLOC_FAIL);
+       if (*len < (int) sizeof(mbr) || *atom == NULL) {
+               GDKfree(*atom);
+               if ((*atom = GDKmalloc(*len = sizeof(mbr))) == NULL)
                        return 0;
-               }
        }
        if (nil) {
                nchars = 3;
@@ -5420,19 +5431,31 @@ wkbaTOSTR(char **toStr, int *len, wkba *
        char *nilStr = "nil";
        char *toStrPtr = NULL, *itemsNumStr = GDKmalloc((itemsNumDigits + 1) * 
sizeof(char));
 
-       if( itemsNumStr == NULL){
-               GDKerror("wkbaTOSTR" MAL_MALLOC_FAIL);
+       if (itemsNumStr == NULL)
                return 0;
-       }
+
        sprintf(itemsNumStr, "%d", items);
        dataSize = strlen(itemsNumStr);
 
        //reserve space for an array with pointers to the partial strings, i.e. 
for each wkbTOSTR
        partialStrs = GDKzalloc(items * sizeof(char *));
+       if (partialStrs == NULL) {
+               GDKfree(itemsNumStr);
+               return 0;
+       }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to