]> granicus.if.org Git - postgis/commitdiff
Fix leak in lwcollection_from_wkb_state
authorRaúl Marín Rodríguez <rmrodriguez@carto.com>
Thu, 10 Oct 2019 11:09:18 +0000 (11:09 +0000)
committerRaúl Marín Rodríguez <rmrodriguez@carto.com>
Thu, 10 Oct 2019 11:09:18 +0000 (11:09 +0000)
Closes #4536
Closes https://github.com/postgis/postgis/pull/493

git-svn-id: http://svn.osgeo.org/postgis/trunk@17893 b70326c6-7e19-0410-871a-916f4a2858ee

NEWS
liblwgeom/cunit/cu_in_wkb.c
liblwgeom/lwin_wkb.c

diff --git a/NEWS b/NEWS
index 35345487b8056d60ba0370db57eafd827c8fa186..2a5396d7a483c275a4db049961e0109ae305b72b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -8,6 +8,7 @@ Additional performance enhancements if running GEOS 3.8+
 
 * Major highlights *
   - #4534, Fix leak in lwcurvepoly_from_wkb_state (Raúl Marín)
+  - #4536, Fix leak in lwcollection_from_wkb_state (Raúl Marín)
 
 PostGIS 3.0.0rc1
 2019/10/08
index ff4fb61c0d9eeb0b75e15fdd0b23022f6bb411f3..c938c34d05b3eb736fd8b746756d25b6bce93804 100644 (file)
@@ -235,6 +235,27 @@ test_wkb_leak(void)
                           000, 000, 000, 000, 010, 000, 000, 000, 000, 000, 000, 000, 000, 010, 000, 000, 000, 000};
        LWGEOM *g = lwgeom_from_wkb(wkb, 36, LW_PARSER_CHECK_NONE);
        lwgeom_free(g);
+
+       /* OSS-FUZZ https://trac.osgeo.org/postgis/ticket/4536 */
+       uint8_t wkb2[319] = {
+           001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001,
+           001, 001, 001, 001, 001, 012, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001,
+           001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 051, 001, 001,
+           001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001,
+           001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 000, 115, 001, 001, 001, 001,
+           001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 000, 001, 001, 001, 001, 001, 001, 001,
+           001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001,
+           001, 001, 001, 001, 001, 001, 000, 000, 000, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001,
+           001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 002,
+           001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001,
+           001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 207, 001,
+           001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001,
+           001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 000, 000, 000, 000, 000,
+           000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 000, 001, 001,
+           001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001,
+           001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001, 001};
+       g = lwgeom_from_wkb(wkb2, 319, LW_PARSER_CHECK_NONE);
+       lwgeom_free(g);
 }
 
 /*
index 051d82405c46dcd5713dc908038314bd3565c100..8f0b235b74d52989480550b41ab2811d89722308 100644 (file)
@@ -660,6 +660,8 @@ static LWCOLLECTION* lwcollection_from_wkb_state(wkb_parse_state *s)
                geom = lwgeom_from_wkb_state(s);
                if ( lwcollection_add_lwgeom(col, geom) == NULL )
                {
+                       lwgeom_free(geom);
+                       lwgeom_free((LWGEOM *)col);
                        lwerror("Unable to add geometry (%p) to collection (%p)", geom, col);
                        return NULL;
                }