Changeset: c99dbabc15c6 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c99dbabc15c6
Modified Files:
        geom/monetdb5/geom.c
Branch: Jun2016
Log Message:

Sanitize exception handling.
Also, checked to make sure no freshly allocated memory gets returned
in failing calls.


diffs (truncated from 1853 to 300 lines):

diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -66,9 +66,9 @@ static str transformCoordSeq(int idx, in
        errorNum = pj_get_errno_ref();
        if (*errorNum != 0){
                if(coordinatesNum >2)
-                       return createException(MAL, "geom.wkbTransform", 
"Couldn't transform point (%f %f %f): %s\n", x, y, z, pj_strerrno(*errorNum));
+                       throw(MAL, "geom.wkbTransform", "Couldn't transform 
point (%f %f %f): %s\n", x, y, z, pj_strerrno(*errorNum));
                else
-                       return createException(MAL, "geom.wkbTransform", 
"Couldn't transform point (%f %f): %s\n", x, y, pj_strerrno(*errorNum));
+                       throw(MAL, "geom.wkbTransform", "Couldn't transform 
point (%f %f): %s\n", x, y, pj_strerrno(*errorNum));
        }
 
 
@@ -101,7 +101,7 @@ static str transformPoint(GEOSGeometry**
 
        if(gcs_old == NULL) {
                *transformedGeometry = NULL;
-               return createException(MAL, "geom.wkbTransform", 
"GEOSGeom_getCoordSeq failed");
+               throw(MAL, "geom.wkbTransform", "GEOSGeom_getCoordSeq failed");
        }
 
        /* create the coordinates sequence for the transformed geometry */
@@ -132,7 +132,7 @@ static str transformLine(GEOSCoordSeq *g
        gcs_old = GEOSGeom_getCoordSeq(geosGeometry);
 
        if(gcs_old == NULL)
-               return createException(MAL, "geom.wkbTransform", 
"GEOSGeom_getCoordSeq failed");
+               throw(MAL, "geom.wkbTransform", "GEOSGeom_getCoordSeq failed");
 
        /* get the number of points in the geometry */
        GEOSCoordSeq_getSize(gcs_old, &pointsNum);
@@ -199,7 +199,7 @@ static str transformPolygon(GEOSGeometry
        exteriorRingGeometry = GEOSGetExteriorRing(geosGeometry);
        if(!exteriorRingGeometry) {
                *transformedGeometry = NULL;
-               return createException(MAL, 
"geom.wkbTransform","GEOSGetExteriorRing failed");
+               throw(MAL, "geom.wkbTransform","GEOSGetExteriorRing failed");
        }
 
        ret = transformLinearRing(&transformedExteriorRingGeometry, 
exteriorRingGeometry, proj4_src, proj4_dst);
@@ -213,7 +213,7 @@ static str transformPolygon(GEOSGeometry
        if (numInteriorRings == -1 ) {
                *transformedGeometry = NULL;
                GEOSGeom_destroy(transformedExteriorRingGeometry);
-               return createException(MAL, "geom.wkbTransform", 
"GEOSGetInteriorRingN failed.");
+               throw(MAL, "geom.wkbTransform", "GEOSGetInteriorRingN failed.");
        }
 
        /* iterate over the interiorRing and transform each one of them */
@@ -335,7 +335,7 @@ str wkbTransform(wkb** transformedWKB, w
        (void)*srid_dst;
        (void)**proj4_src_str;
        (void)**proj4_dst_str;
-       return createException(MAL, "geom.Transform", "Function Not 
Implemented");
+       throw(MAL, "geom.Transform", "Function Not Implemented");
 #else
        projPJ proj4_src, proj4_dst;
        GEOSGeom geosGeometry, transformedGeosGeometry;
@@ -408,21 +408,21 @@ static str forceDimCoordSeq(int idx, int
 
        //get the coordinates
        if(!GEOSCoordSeq_getX(gcs_old, idx, &x))
-               return createException(MAL, "geom.ForceDim", "GEOSCoordSeq_getX 
failed");
+               throw(MAL, "geom.ForceDim", "GEOSCoordSeq_getX failed");
        if(!GEOSCoordSeq_getY(gcs_old, idx, &y))
-               return createException(MAL, "geom.ForceDim", "GEOSCoordSeq_getY 
failed");
+               throw(MAL, "geom.ForceDim", "GEOSCoordSeq_getY failed");
        if(coordinatesNum > 2 && dim > 2) //read it only if needed (dim >2)
                if(!GEOSCoordSeq_getZ(gcs_old, idx, &z))
-                       return createException(MAL, "geom.ForceDim", 
"GEOSCoordSeq_getZ failed");
+                       throw(MAL, "geom.ForceDim", "GEOSCoordSeq_getZ failed");
 
        //create the new coordinates
        if(!GEOSCoordSeq_setX(*gcs_new, idx, x))
-               return createException(MAL, "geom.ForceDim", "GEOSCoordSeq_setX 
failed");
+               throw(MAL, "geom.ForceDim", "GEOSCoordSeq_setX failed");
        if(!GEOSCoordSeq_setY(*gcs_new, idx, y))
-               return createException(MAL, "geom.ForceDim", "GEOSCoordSeq_setY 
failed");
+               throw(MAL, "geom.ForceDim", "GEOSCoordSeq_setY failed");
        if(dim > 2)
                if(!GEOSCoordSeq_setZ(*gcs_new, idx, z))
-                       return createException(MAL, "geom.ForceDim", 
"GEOSCoordSeq_setZ failed");
+                       throw(MAL, "geom.ForceDim", "GEOSCoordSeq_setZ failed");
        return MAL_SUCCEED;
 }
 
@@ -439,7 +439,7 @@ static str forceDimPoint(GEOSGeometry** 
 
        if(gcs_old == NULL) {
                *outGeometry = NULL;
-               return createException(MAL, "geom.ForceDim", 
"GEOSGeom_getCoordSeq failed");
+               throw(MAL, "geom.ForceDim", "GEOSGeom_getCoordSeq failed");
        }
 
        /* create the coordinates sequence for the translated geometry */
@@ -471,7 +471,7 @@ static str forceDimLineString(GEOSGeomet
        gcs_old = GEOSGeom_getCoordSeq(geosGeometry);
 
        if(gcs_old == NULL)
-               return createException(MAL, "geom.ForceDim", 
"GEOSGeom_getCoordSeq failed");
+               throw(MAL, "geom.ForceDim", "GEOSGeom_getCoordSeq failed");
 
        /* get the number of points in the geometry */
        GEOSCoordSeq_getSize(gcs_old, &pointsNum);
@@ -509,7 +509,7 @@ static str forceDimLinearRing(GEOSGeomet
        gcs_old = GEOSGeom_getCoordSeq(geosGeometry);
 
        if(gcs_old == NULL)
-               return createException(MAL, "geom.ForceDim", 
"GEOSGeom_getCoordSeq failed");
+               throw(MAL, "geom.ForceDim", "GEOSGeom_getCoordSeq failed");
 
        /* get the number of points in the geometry */
        GEOSCoordSeq_getSize(gcs_old, &pointsNum);
@@ -543,7 +543,7 @@ static str forceDimPolygon(GEOSGeometry*
        exteriorRingGeometry = GEOSGetExteriorRing(geosGeometry);
        if(!exteriorRingGeometry) {
                *outGeometry = NULL;
-               return createException(MAL, 
"geom.ForceDim","GEOSGetExteriorRing failed");
+               throw(MAL, "geom.ForceDim","GEOSGetExteriorRing failed");
        }
 
        if((ret = forceDimLinearRing(&transformedExteriorRingGeometry, 
exteriorRingGeometry, dim)) != MAL_SUCCEED) {
@@ -555,7 +555,7 @@ static str forceDimPolygon(GEOSGeometry*
        if (numInteriorRings == -1 ) {
                *outGeometry = NULL;
                GEOSGeom_destroy(transformedExteriorRingGeometry);
-               return createException(MAL, "geom.ForceDim", 
"GEOSGetInteriorRingN failed.");
+               throw(MAL, "geom.ForceDim", "GEOSGetInteriorRingN failed.");
        }
 
        /* iterate over the interiorRing and translate each one of them */
@@ -586,13 +586,11 @@ static str forceDimMultiGeometry(GEOSGeo
                str err;
                const GEOSGeometry* multiGeometry = 
GEOSGetGeometryN(geosGeometry, i);
 
-               if((err = forceDimGeometry(&(transformedMultiGeometries[i]), 
multiGeometry, dim)) != MAL_SUCCEED) {
-                       str msg = createException(MAL, "geom.ForceDim", "%s", 
err);
-                       GDKfree(err);
+               if((err = forceDimGeometry(&transformedMultiGeometries[i], 
multiGeometry, dim)) != MAL_SUCCEED) {
                        GDKfree(*transformedMultiGeometries);
                        *outGeometry = NULL;
 
-                       return msg;
+                       return err;
                }
        }
 
@@ -602,48 +600,25 @@ static str forceDimMultiGeometry(GEOSGeo
 }
 
 static str forceDimGeometry(GEOSGeometry** outGeometry, const GEOSGeometry* 
geosGeometry, int dim) {
-       str err;
        int geometryType = GEOSGeomTypeId(geosGeometry)+1;
 
        //check the type of the geometry
        switch(geometryType) {
        case wkbPoint_mdb:
-               if((err = forceDimPoint(outGeometry, geosGeometry, dim)) != 
MAL_SUCCEED){
-                       str msg = createException(MAL, "geom.ForceDim", 
"%s",err);
-                       GDKfree(err);
-                       return msg;
-               }
-               break;
+               return forceDimPoint(outGeometry, geosGeometry, dim);
        case wkbLineString_mdb:
        case wkbLinearRing_mdb:
-               if((err = forceDimLineString(outGeometry, geosGeometry, dim)) 
!= MAL_SUCCEED){
-                       str msg = createException(MAL, "geom.ForceDim", 
"%s",err);
-                       GDKfree(err);
-                       return msg;
-               }
-               break;
+               return forceDimLineString(outGeometry, geosGeometry, dim);
        case wkbPolygon_mdb:
-               if((err = forceDimPolygon(outGeometry, geosGeometry, dim)) != 
MAL_SUCCEED){
-                       str msg = createException(MAL, "geom.ForceDim", 
"%s",err);
-                       GDKfree(err);
-                       return msg;
-               }
-               break;
+               return forceDimPolygon(outGeometry, geosGeometry, dim);
        case wkbMultiPoint_mdb:
        case wkbMultiLineString_mdb:
        case wkbMultiPolygon_mdb:
        case wkbGeometryCollection_mdb:
-               if((err = forceDimMultiGeometry(outGeometry, geosGeometry, 
dim)) != MAL_SUCCEED){
-                       str msg = createException(MAL, "geom.ForceDim", 
"%s",err);
-                       GDKfree(err);
-                       return msg;
-               }
-               break;
+               return forceDimMultiGeometry(outGeometry, geosGeometry, dim);
        default:
-               return createException(MAL, "geom.ForceDim", "%s Unknown 
geometry type", geom_type2str(geometryType,0));
-       }
-
-       return MAL_SUCCEED;
+               throw(MAL, "geom.ForceDim", "%s Unknown geometry type", 
geom_type2str(geometryType,0));
+       }
 }
 
 str wkbForceDim(wkb** outWKB, wkb** geomWKB, int *dim) {
@@ -659,16 +634,14 @@ str wkbForceDim(wkb** outWKB, wkb** geom
        geosGeometry = wkb2geos(*geomWKB);
        if(!geosGeometry) {
                *outWKB = NULL;
-               return createException(MAL, "geom.ForceDim", "wkb2geos failed");
+               throw(MAL, "geom.ForceDim", "wkb2geos failed");
        }
 
        if((err = forceDimGeometry(&outGeometry, geosGeometry, *dim)) != 
MAL_SUCCEED) {
-               str msg = createException(MAL, "geom.ForceDim", "%s", err);
                GEOSGeom_destroy(geosGeometry);
                *outWKB = NULL;
 
-               GDKfree(err);
-               return msg;
+               return err;
        }
 
        GEOSSetSRID(outGeometry, GEOSGetSRID(geosGeometry));
@@ -691,12 +664,12 @@ static str segmentizePoint(GEOSGeometry*
        //get the coordinates
        if(!(gcs_old = GEOSGeom_getCoordSeq(geosGeometry))) {
                *outGeometry = NULL;
-               return createException(MAL, "geom.Segmentize", 
"GEOSGeom_getCoordSeq failed");
+               throw(MAL, "geom.Segmentize", "GEOSGeom_getCoordSeq failed");
        }
        //create a copy of it
        if(!(gcs_new = GEOSCoordSeq_clone(gcs_old))) {
                *outGeometry = NULL;
-               return createException(MAL, "geom.Segmentize", 
"GEOSCoordSeq_clone failed");
+               throw(MAL, "geom.Segmentize", "GEOSCoordSeq_clone failed");
        }
 
        //create the geometry from the coordinates sequence
@@ -718,36 +691,36 @@ static str segmentizeLineString(GEOSGeom
        //get the coordinates of the points comprising the geometry
        if(!(gcs_old = GEOSGeom_getCoordSeq(geosGeometry))) {
                *outGeometry = NULL;
-               return createException(MAL, "geom.Segmentize", 
"GEOSGeom_getCoordSeq failed");
+               throw(MAL, "geom.Segmentize", "GEOSGeom_getCoordSeq failed");
        }
 
        //get the number of points in the geometry
        if(!(GEOSCoordSeq_getSize(gcs_old, &pointsNum))) {
                *outGeometry = NULL;
-               return createException(MAL, "geom.Segmentize", 
"GEOSCoordSeq_getSize failed");
+               throw(MAL, "geom.Segmentize", "GEOSCoordSeq_getSize failed");
        }
 
        //store the points so that I do not have to read them multiple times 
using geos
        if(!(xCoords_org = GDKmalloc(pointsNum*sizeof(double)))) {
                *outGeometry = NULL;
-               return createException(MAL, "geom.Segmentize", "Could not 
allocate memory for %d double values", pointsNum);
+               throw(MAL, "geom.Segmentize", "Could not allocate memory for %d 
double values", pointsNum);
        }
        if(!(yCoords_org = GDKmalloc(pointsNum*sizeof(double)))) {
                *outGeometry = NULL;
-               return createException(MAL, "geom.Segmentize", "Could not 
allocate memory for %d double values", pointsNum);
+               throw(MAL, "geom.Segmentize", "Could not allocate memory for %d 
double values", pointsNum);
        }
        if(!(zCoords_org = GDKmalloc(pointsNum*sizeof(double)))) {
                *outGeometry = NULL;
-               return createException(MAL, "geom.Segmentize", "Could not 
allocate memory for %d double values", pointsNum);
+               throw(MAL, "geom.Segmentize", "Could not allocate memory for %d 
double values", pointsNum);
        }
 
        if(!GEOSCoordSeq_getX(gcs_old, 0, &xCoords_org[0]))
-               return createException(MAL, "geom.Segmentize", 
"GEOSCoordSeq_getX failed");
+               throw(MAL, "geom.Segmentize", "GEOSCoordSeq_getX failed");
        if(!GEOSCoordSeq_getY(gcs_old, 0, &yCoords_org[0]))
-               return createException(MAL, "geom.Segmentize", 
"GEOSCoordSeq_getY failed");
+               throw(MAL, "geom.Segmentize", "GEOSCoordSeq_getY failed");
        if(coordinatesNum > 2)
                if(!GEOSCoordSeq_getZ(gcs_old, 0, &zCoords_org[0]))
-                       return createException(MAL, "geom.Segmentize", 
"GEOSCoordSeq_getZ failed");
+                       throw(MAL, "geom.Segmentize", "GEOSCoordSeq_getZ 
failed");
 
        xl=xCoords_org[0];
        yl=yCoords_org[0];
@@ -758,12 +731,12 @@ static str segmentizeLineString(GEOSGeom
                double dist = 0.0;
 
                if(!GEOSCoordSeq_getX(gcs_old, i, &xCoords_org[i]))
-                       return createException(MAL, "geom.Segmentize", 
"GEOSCoordSeq_getX failed");
+                       throw(MAL, "geom.Segmentize", "GEOSCoordSeq_getX 
failed");
                if(!GEOSCoordSeq_getY(gcs_old, i, &yCoords_org[i]))
-                       return createException(MAL, "geom.Segmentize", 
"GEOSCoordSeq_getY failed");
+                       throw(MAL, "geom.Segmentize", "GEOSCoordSeq_getY 
failed");
                if(coordinatesNum > 2)
                        if(!GEOSCoordSeq_getZ(gcs_old, i, &zCoords_org[i]))
-                               return createException(MAL, "geom.Segmentize", 
"GEOSCoordSeq_getZ failed");
+                               throw(MAL, "geom.Segmentize", 
"GEOSCoordSeq_getZ failed");
 
                //compute the distance of the current point to the last added 
one
                dist = sqrt(pow(xl-xCoords_org[i],2) + pow(yl-yCoords_org[i],2) 
+ pow(zl-zCoords_org[i],2));
@@ -789,17 +762,17 @@ static str segmentizeLineString(GEOSGeom
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to