]> granicus.if.org Git - postgis/commitdiff
ST_GeomFromGML on CurvePolygon causes server crash (#1936)
authorPaul Ramsey <pramsey@cleverelephant.ca>
Fri, 7 Sep 2012 20:05:25 +0000 (20:05 +0000)
committerPaul Ramsey <pramsey@cleverelephant.ca>
Fri, 7 Sep 2012 20:05:25 +0000 (20:05 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@10255 b70326c6-7e19-0410-871a-916f4a2858ee

NEWS
postgis/lwgeom_in_gml.c
regress/tickets.sql
regress/tickets_expected

diff --git a/NEWS b/NEWS
index da92ac853bea31091f24b7156e278561924e263c..3d4041e9641e88fa22fd75c5bafcf12b9407a653 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -44,6 +44,7 @@ PostGIS 2.1.0
   - #1875, ST_SummaryStats returns NULL for all parameters except count
            when count is zero
   - #1932, fix raster2pgsql of syntax for index tablespaces
+  - #1936, ST_GeomFromGML on CurvePolygon causes server crash
   - #1939, remove custom data types: summarystats, histogram, quantile, valuecount
   - #1951, remove crash on zero-length linestrings
   - #1957, ST_Distance to a one-point LineString returns NULL 
index 1a045b6e741f4d3ea5481b22c5a8d2e9d975cccf..ab0046bc34bd7b3998036fff949a932702c049c5 100644 (file)
@@ -1168,6 +1168,10 @@ static LWGEOM* parse_gml_polygon(xmlNodePtr xnode, bool *hasz, int *root_srid)
                }
        }
 
+       /* Found an <exterior> or <outerBoundaryIs> but no rings?!? We're outa here! */
+       if ( ! ppa )
+               gml_lwerror("invalid GML representation", 43);  
+
        for (ring=1, xa = xnode->children ; xa != NULL ; xa = xa->next)
        {
                /* Polygon/innerBoundaryIs -> GML 2.1.2 */
index 9008a8e69a376e4560ea259c70f88fcf7c37828e..ec791def640ec82e721f8655e35ea6fe7ae27138 100644 (file)
@@ -680,6 +680,40 @@ with inp as ( SELECT
 -- #1799 --
 SELECT '#1799', ST_Segmentize('LINESTRING(0 0, 10 0)'::geometry, 0);
 
+-- #1936 --
+select st_astext(st_geomfromgml(
+    '<gml:Polygon xmlns:gml="http://www.opengis.net/gml/3.2" 
+    gml:id="HPA.15449990010" srsName="urn:ogc:def:crs:EPSG::4326" 
+    srsDimension="2">
+    <gml:exterior>
+    <gml:Ring>
+    <gml:curveMember>
+    <gml:LineString gml:id="HPA.15449990010.1">
+    <gml:posList>711540.35 1070163.61 711523.82 1070166.54 711521.30 1070164.14 711519.52 1070162.44 711518.57 1070164.62 712154.47 1070824.94</gml:posList>
+    </gml:LineString>
+    </gml:curveMember>
+    <gml:curveMember>
+    <gml:Curve gml:id="HPA.15449990010.2">
+    <gml:segments><gml:ArcString>
+    <gml:posList>712154.47 1070824.94 712154.98 1070826.04 712154.41 1070827.22</gml:posList>
+    </gml:ArcString>
+    </gml:segments>
+    </gml:Curve>
+    </gml:curveMember>
+    <gml:curveMember>
+    <gml:LineString gml:id="HPA.15449990010.3">
+    <gml:posList>712154.41 1070827.22 712160.31 1070837.07 712160.92 1070835.36 712207.89 1071007.95</gml:posList>
+    </gml:LineString>
+    </gml:curveMember>
+    <gml:curveMember>
+    <gml:Curve gml:id="HPA.15449990010.4"><gml:segments><gml:ArcString><gml:posList>712207.89 1071007.95 712207.48 1071005.59 712208.38 1071001.28</gml:posList></gml:ArcString></gml:segments></gml:Curve></gml:curveMember><gml:curveMember><gml:LineString gml:id="HPA.15449990010.5"><gml:posList>712208.38 1071001.28 712228.74 1070949.67 712233.98 1070936.15 712124.93 1070788.72</gml:posList></gml:LineString></gml:curveMember><gml:curveMember><gml:Curve gml:id="HPA.15449990010.6"><gml:segments><gml:ArcString><gml:posList>712124.93 1070788.72 712124.28 1070785.87 712124.63 1070783.38</gml:posList></gml:ArcString></gml:segments></gml:Curve></gml:curveMember><gml:curveMember><gml:LineString gml:id="HPA.15449990010.7"><gml:posList>712124.63 1070783.38 712141.04 1070764.12 712146.60 1070757.01 711540.35 1070163.61</gml:posList></gml:LineString></gml:curveMember></gml:Ring></gml:exterior>
+    <gml:interior>
+    <gml:LinearRing>
+    <gml:posList>713061.62 1070354.46 713053.59 1070335.12 713049.58 1070315.92 713049.65 1070298.33 713061.62 1070354.46</gml:posList>
+    </gml:LinearRing>
+    </gml:interior>
+    </gml:Polygon>'));
+
 -- #1957 --
 SELECT '#1957', ST_Distance(ST_Makeline(ARRAY['POINT(1 0)'::geometry]), 'POINT(0 0)'::geometry);
 
index d8cd736c96917e0d5fdcbc5caa7c67055002d6b9..fe3f74af6c84384d0e4d3d5c32f5a8cb2f325bed 100644 (file)
@@ -220,4 +220,5 @@ NOTICE:  SRID value -1 converted to the officially unknown SRID value 0
 #1776|POLYGON((0 0,10 0,10 10,0 0))|POLYGON((0 0,10 0,10 10,0 0))
 #1791|4.7
 ERROR:  ST_Segmentize: invalid max_distance 0 (must be >= 0)
+ERROR:  invalid GML representation
 #1957|1