]> granicus.if.org Git - postgis/commitdiff
Fixed up de-serialization routines to avoid *geoms = malloc(0) cases which were causi...
authorPaul Ramsey <pramsey@cleverelephant.ca>
Mon, 4 Jan 2010 17:55:14 +0000 (17:55 +0000)
committerPaul Ramsey <pramsey@cleverelephant.ca>
Mon, 4 Jan 2010 17:55:14 +0000 (17:55 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@5099 b70326c6-7e19-0410-871a-916f4a2858ee

liblwgeom/cunit/cu_libgeom.c
liblwgeom/cunit/cu_libgeom.h
liblwgeom/lwcollection.c
liblwgeom/lwmcurve.c
liblwgeom/lwmline.c
liblwgeom/lwmpoint.c
liblwgeom/lwmpoly.c
liblwgeom/lwmsurface.c
liblwgeom/lwpoly.c

index a0e1aa48b87d0ac1f824cdb8b5ed577efd963df9..5d71152ba3ac2b4aa333523dd625beb1b88c6ac0 100644 (file)
@@ -35,7 +35,8 @@ CU_pSuite register_libgeom_suite(void)
            (NULL == CU_add_test(pSuite, "test_lwgeom_count_vertices()", test_lwgeom_count_vertices))  || 
            (NULL == CU_add_test(pSuite, "test_on_gser_lwgeom_count_vertices()", test_on_gser_lwgeom_count_vertices))  ||
            (NULL == CU_add_test(pSuite, "test_geometry_type_from_string()", test_geometry_type_from_string)) || 
-           (NULL == CU_add_test(pSuite, "test_lwcollection_extract()", test_lwcollection_extract))  
+           (NULL == CU_add_test(pSuite, "test_lwcollection_extract()", test_lwcollection_extract)) ||
+           (NULL == CU_add_test(pSuite, "test_lwgeom_free()", test_lwgeom_free))  
 
        )
        {
@@ -343,3 +344,29 @@ void test_lwcollection_extract(void)
        lwgeom_free(geom);
        
 }
+
+void test_lwgeom_free(void)
+{
+       LWGEOM *geom;
+       
+       /* Empty geometries don't seem to free properly (#370) */
+       geom = lwgeom_from_ewkt("GEOMETRYCOLLECTION EMPTY", PARSER_CHECK_NONE);
+       CU_ASSERT_EQUAL(TYPE_GETTYPE(geom->type), COLLECTIONTYPE);
+       lwgeom_free(geom);      
+
+       /* Empty geometries don't seem to free properly (#370) */
+       geom = lwgeom_from_ewkt("POLYGON EMPTY", PARSER_CHECK_NONE);
+       CU_ASSERT_EQUAL(TYPE_GETTYPE(geom->type), COLLECTIONTYPE);
+       lwgeom_free(geom);      
+
+       /* Empty geometries don't seem to free properly (#370) */
+       geom = lwgeom_from_ewkt("LINESTRING EMPTY", PARSER_CHECK_NONE);
+       CU_ASSERT_EQUAL(TYPE_GETTYPE(geom->type), COLLECTIONTYPE);
+       lwgeom_free(geom);      
+
+       /* Empty geometries don't seem to free properly (#370) */
+       geom = lwgeom_from_ewkt("POINT EMPTY", PARSER_CHECK_NONE);
+       CU_ASSERT_EQUAL(TYPE_GETTYPE(geom->type), COLLECTIONTYPE);
+       lwgeom_free(geom);      
+
+}
index fca263e009451509b9cacb0bad2652108db9a1e9..c319384ecadd8aca6e9c832c3e97f27032be66db 100644 (file)
@@ -23,7 +23,6 @@
 */
 
 
-
 /* Test functions */
 void test_typmod_macros(void);
 void test_flags_macros(void);
@@ -35,4 +34,4 @@ void test_gbox_serialized_size(void);
 void test_lwcollection_extract(void);
 void test_lwgeom_count_vertices(void);
 void test_on_gser_lwgeom_count_vertices(void);
-
+void test_lwgeom_free(void);
index 87fe9641dafb6632f85547e17dfbc478ed3dfa31..a268fc2c06b743029ce7c40112e6a7dd5d548b7a 100644 (file)
@@ -115,7 +115,10 @@ lwcollection_deserialize(uchar *srl)
                result->bbox = lwalloc(sizeof(BOX2DFLOAT4));
                memcpy(result->bbox, srl+1, sizeof(BOX2DFLOAT4));
        }
-       else result->bbox = NULL;
+       else 
+       {
+               result->bbox = NULL;
+       }
 
 
        if ( insp->ngeometries )
@@ -126,6 +129,10 @@ lwcollection_deserialize(uchar *srl)
                        result->geoms[i] = lwgeom_deserialize(insp->sub_geoms[i]);
                }
        }
+       else
+       {
+               result->geoms = NULL;
+       }
 
        return result;
 }
index 5b33fbfbe4a6371a4d2bb989c8437b54d6d29e91..bacf15c59e40c5890045efa928a4fcb3ed04e9fc 100644 (file)
@@ -36,7 +36,15 @@ lwmcurve_deserialize(uchar *srl)
        result->type = insp->type;
        result->SRID = insp->SRID;
        result->ngeoms = insp->ngeometries;
-       result->geoms = lwalloc(sizeof(LWGEOM *)*insp->ngeometries);
+       
+       if( insp->ngeometries )
+       {
+               result->geoms = lwalloc(sizeof(LWGEOM *)*insp->ngeometries);
+       }
+       else
+       {
+               result->geoms = NULL;
+       }
 
        if (lwgeom_hasBBOX(srl[0]))
        {
index 10ef57c1f7f950e2ef83e75b1fa696b0e2fcfe9d..f3e82b18969f761282475fad4004c660fab2afad 100644 (file)
@@ -42,7 +42,15 @@ lwmline_deserialize(uchar *srl)
        result->type = insp->type;
        result->SRID = insp->SRID;
        result->ngeoms = insp->ngeometries;
-       result->geoms = lwalloc(sizeof(LWLINE *)*insp->ngeometries);
+       
+       if( insp->ngeometries ) 
+       {
+               result->geoms = lwalloc(sizeof(LWLINE *)*insp->ngeometries);
+       }
+       else
+       {
+               result->geoms = NULL;
+       }
 
        if (lwgeom_hasBBOX(srl[0]))
        {
index 99e762312314b3f797783a4240173d93ecefc42b..fc23b6ef3acc88f8c6475edd0060d80e7d95568c 100644 (file)
@@ -43,14 +43,25 @@ lwmpoint_deserialize(uchar *srl)
        result->type = insp->type;
        result->SRID = insp->SRID;
        result->ngeoms = insp->ngeometries;
-       result->geoms = lwalloc(sizeof(LWPOINT *)*result->ngeoms);
+       
+       if ( insp->ngeometries )
+       {
+               result->geoms = lwalloc(sizeof(LWPOINT *)*insp->ngeometries);
+       }
+       else
+       {
+               result->geoms = NULL;
+       }
 
        if (lwgeom_hasBBOX(srl[0]))
        {
                result->bbox = lwalloc(sizeof(BOX2DFLOAT4));
                memcpy(result->bbox, srl+1, sizeof(BOX2DFLOAT4));
        }
-       else result->bbox = NULL;
+       else 
+       {
+               result->bbox = NULL;
+       }
 
        for (i=0; i<insp->ngeometries; i++)
        {
index 4303b151e30ad591c0941020d8a64ac5e5b21f5a..4c328e94f2cf9b96bec68c96c1048548779c684c 100644 (file)
@@ -46,7 +46,15 @@ lwmpoly_deserialize(uchar *srl)
        result->type = insp->type;
        result->SRID = insp->SRID;
        result->ngeoms = insp->ngeometries;
-       result->geoms = lwalloc(sizeof(LWPOLY *)*insp->ngeometries);
+       
+       if( insp->ngeometries )
+       {
+               result->geoms = lwalloc(sizeof(LWPOLY *)*insp->ngeometries);
+       }
+       else
+       {
+               result->geoms = NULL;
+       }
 
        if (lwgeom_hasBBOX(srl[0]))
        {
index e21fd1cde1dbe7d7125143d907275a0fa5eb8799..2bce28986ce3765bd7ed491cf2802c4c7fdc84ea 100644 (file)
@@ -39,7 +39,15 @@ lwmsurface_deserialize(uchar *srl)
        result->type = insp->type;
        result->SRID = insp->SRID;
        result->ngeoms = insp->ngeometries;
-       result->geoms = lwalloc(sizeof(LWPOLY *)*insp->ngeometries);
+       
+       if( insp->ngeometries )
+       {
+               result->geoms = lwalloc(sizeof(LWPOLY *)*insp->ngeometries);
+       }
+       else 
+       {
+               result->geoms = NULL;
+       }
 
        if (lwgeom_hasBBOX(srl[0]))
        {
index 794c39a6c7099b94eba59e0534618fe88ca923e5..77602c64f6726a388dc9e7e601d3dc0b68a8bdf0 100644 (file)
@@ -128,7 +128,14 @@ lwpoly_deserialize(uchar *serialized_form)
        nrings = lw_get_uint32(loc);
        result->nrings = nrings;
        loc +=4;
-       result->rings = (POINTARRAY**) lwalloc(nrings* sizeof(POINTARRAY*));
+       if( nrings )
+       {
+               result->rings = (POINTARRAY**) lwalloc(nrings* sizeof(POINTARRAY*));
+       }
+       else
+       {
+               result->rings = NULL;
+       }
 
        for (t =0;t<nrings;t++)
        {