Changeset: 4e1d5130b890 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/4e1d5130b890
Modified Files:
        geom/monetdb5/geom.c
Branch: geo-update
Log Message:

Avoid SEGFAULT by checking for 0


diffs (47 lines):

diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -1410,24 +1410,27 @@ transformPolygon(GEOSGeometry **transfor
                throw(MAL, "geom.Transform", SQLSTATE(38000) "Geos operation 
GEOSGetInteriorRingN failed.");
        }
 
-       /* iterate over the interiorRing and transform each one of them */
-       transformedInteriorRingGeometries = GDKmalloc(numInteriorRings * 
sizeof(GEOSGeometry *));
-       if (transformedInteriorRingGeometries == NULL) {
-               *transformedGeometry = NULL;
-               GEOSGeom_destroy(transformedExteriorRingGeometry);
-               throw(MAL, "geom.Transform", SQLSTATE(HY013) MAL_MALLOC_FAIL);
-       }
-       for (i = 0; i < numInteriorRings; i++) {
-               ret = 
transformLinearRing(&transformedInteriorRingGeometries[i], 
GEOSGetInteriorRingN(geosGeometry, i), proj4_src, proj4_dst);
-               if (ret != MAL_SUCCEED) {
-                       while (--i >= 0)
-                               
GEOSGeom_destroy(transformedInteriorRingGeometries[i]);
-                       GDKfree(transformedInteriorRingGeometries);
+       if(numInteriorRings > 0)
+       {
+               /* iterate over the interiorRing and transform each one of them 
*/
+               transformedInteriorRingGeometries = GDKmalloc(numInteriorRings 
* sizeof(GEOSGeometry *));
+               if (transformedInteriorRingGeometries == NULL) {
+                       *transformedGeometry = NULL;
                        GEOSGeom_destroy(transformedExteriorRingGeometry);
-                       *transformedGeometry = NULL;
-                       return ret;
+                       throw(MAL, "geom.Transform", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
                }
-               GEOSSetSRID(transformedInteriorRingGeometries[i], srid);
+               for (i = 0; i < numInteriorRings; i++) {
+                       ret = 
transformLinearRing(&transformedInteriorRingGeometries[i], 
GEOSGetInteriorRingN(geosGeometry, i), proj4_src, proj4_dst);
+                       if (ret != MAL_SUCCEED) {
+                               while (--i >= 0)
+                                       
GEOSGeom_destroy(transformedInteriorRingGeometries[i]);
+                               GDKfree(transformedInteriorRingGeometries);
+                               
GEOSGeom_destroy(transformedExteriorRingGeometry);
+                               *transformedGeometry = NULL;
+                               return ret;
+                       }
+                       GEOSSetSRID(transformedInteriorRingGeometries[i], srid);
+               }
        }
 
        *transformedGeometry = 
GEOSGeom_createPolygon(transformedExteriorRingGeometry, 
transformedInteriorRingGeometries, numInteriorRings);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to