From 732a08784e7aa1461c6f651ed6e8063a45bdaa8b Mon Sep 17 00:00:00 2001 From: Paul Ramsey Date: Thu, 26 Mar 2015 22:30:51 +0000 Subject: [PATCH] GeoJSON maintenance git-svn-id: http://svn.osgeo.org/postgis/trunk@13401 b70326c6-7e19-0410-871a-916f4a2858ee --- liblwgeom/lwin_geojson.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/liblwgeom/lwin_geojson.c b/liblwgeom/lwin_geojson.c index 60b728a34..9724a5e14 100644 --- a/liblwgeom/lwin_geojson.c +++ b/liblwgeom/lwin_geojson.c @@ -58,7 +58,11 @@ findMemberByName(json_object* poObj, const char* pszName ) if( NULL != json_object_get_object(poTmp) ) { - assert( NULL != json_object_get_object(poTmp)->head ); + if( NULL == json_object_get_object(poTmp)->head ) + { + geojson_lwerror("invalid GeoJSON representation", 2); + return NULL; + } for( it.entry = json_object_get_object(poTmp)->head; ( it.entry ? @@ -89,7 +93,12 @@ parse_geojson_coord(json_object *poObj, int *hasz, POINTARRAY *pa) const int nSize = json_object_array_length( poObj ); LWDEBUGF(3, "parse_geojson_coord called for array size %d.", nSize ); - + if ( nSize < 2 ) + { + geojson_lwerror("Too few ordinates in GeoJSON", 4); + return LW_FAILURE; + } + // Read X coordinate poObjCoord = json_object_array_get_idx( poObj, 0 ); pt.x = json_object_get_double( poObjCoord ); @@ -100,7 +109,7 @@ parse_geojson_coord(json_object *poObj, int *hasz, POINTARRAY *pa) pt.y = json_object_get_double( poObjCoord ); LWDEBUGF(3, "parse_geojson_coord pt.y = %f.", pt.y ); - if( nSize == 3 ) /* should this be >= 3 ? */ + if( nSize < 2 ) /* should this be >= 3 ? */ { // Read Z coordinate poObjCoord = json_object_array_get_idx( poObj, 2 ); @@ -108,19 +117,27 @@ parse_geojson_coord(json_object *poObj, int *hasz, POINTARRAY *pa) LWDEBUGF(3, "parse_geojson_coord pt.z = %f.", pt.z ); *hasz = LW_TRUE; } - else + else if ( nSize == 2 ) { *hasz = LW_FALSE; /* Initialize Z coordinate, if required */ if ( FLAGS_GET_Z(pa->flags) ) pt.z = 0.0; } - - /* TODO: should we account for nSize > 3 ? */ + else + { + /* TODO: should we account for nSize > 3 ? */ + /* more than 3 coordinates, we're just dropping dimensions here... */ + } /* Initialize M coordinate, if required */ if ( FLAGS_GET_M(pa->flags) ) pt.m = 0.0; } + else + { + /* If it's not an array, just don't handle it */ + return LW_FAILURE; + } return ptarray_append_point(pa, &pt, LW_TRUE); } -- 2.40.0