From: Paul Ramsey Date: Wed, 11 Oct 2017 14:05:25 +0000 (+0000) Subject: Fix rare missing boxes in geometry subdivision X-Git-Tag: 2.4.1~8 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bef5a6156771ef87c41c82cae7a25a727ef37d26;p=postgis Fix rare missing boxes in geometry subdivision References #3886 git-svn-id: http://svn.osgeo.org/postgis/branches/2.4@15965 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/NEWS b/NEWS index f18bde957..ac4ca807f 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,7 @@ YYYY/MM/DD - #3882, undefined behaviour in zigzag with negative inputs - #3891, undefined behaviour in pointarray_to_encoded_polyline - #3895, throw error on malformed WKB input + - #3886, fix rare missing boxes in geometry subdivision PostGIS 2.4.0 diff --git a/liblwgeom/lwgeom_geos.c b/liblwgeom/lwgeom_geos.c index 14799810f..1d3ccf707 100644 --- a/liblwgeom/lwgeom_geos.c +++ b/liblwgeom/lwgeom_geos.c @@ -262,19 +262,25 @@ ptarray_to_GEOSLinearRing(const POINTARRAY *pa, int autofix) if ( autofix ) { - /* check ring for being closed and fix if not */ - if ( ! ptarray_is_closed_2d(pa) ) + if (pa->npoints < 1) { - npa = ptarray_addPoint(pa, getPoint_internal(pa, 0), FLAGS_NDIMS(pa->flags), pa->npoints); - pa = npa; + lwerror("ptarray_to_GEOSLinearRing called with autofix and 0 vertices in ring, cannot fix"); } - /* TODO: check ring for having at least 4 vertices */ -#if 0 + + /* + * Check ring for being closed and fix if not. + * Also create a copy of geometry to operate on. + */ + if ( ! ptarray_is_closed_2d(pa) || pa->npoints < 4 ) + { + pa = ptarray_addPoint(pa, getPoint_internal(pa, 0), FLAGS_NDIMS(pa->flags), pa->npoints); + npa = pa; + } + /* Check ring for having at least 4 vertices */ while ( pa->npoints < 4 ) { - npa = ptarray_addPoint(npa, getPoint_internal(pa, 0), FLAGS_NDIMS(pa->flags), pa->npoints); + ptarray_append_point(pa, getPoint_internal(pa, 0), LW_TRUE); } -#endif } sq = ptarray_to_GEOSCoordSeq(pa);