]> 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:43:01 +0000 (11:43 +0000)
committerRaúl Marín Rodríguez <rmrodriguez@carto.com>
Thu, 10 Oct 2019 11:43:01 +0000 (11:43 +0000)
References #4536

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

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

diff --git a/NEWS b/NEWS
index 2c681f929c4c65aaf1d544ac7807d564d69c0320..330f2db5d2532b133b63d73e557235c85c3451e6 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,7 @@ PostGIS 2.5.4
   - #4519, Fix getSRIDbySRS crash (Raúl Marín)
   - #4517, Documentation error ST_EndPoint (Samuel Spurling)
   - #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 2.5.3
index cb5c3421afce98eb2de31b5a2a393b58a07af11b..5a47057f1ef2b98f552cdd0ada36c03030b68676 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 b1076288ce2f23322a6c2bdf1ae349a2539adef7..6488c9eefa9f3c0696f7f26fad4c06eabdfd5dec 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;
                }