From e1bd2fceb508822982ea6e1c7ca4ae60ddb5a4b1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ra=C3=BAl=20Mar=C3=ADn=20Rodr=C3=ADguez?= Date: Thu, 10 Oct 2019 11:09:18 +0000 Subject: [PATCH] Fix leak in lwcollection_from_wkb_state 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 | 1 + liblwgeom/cunit/cu_in_wkb.c | 21 +++++++++++++++++++++ liblwgeom/lwin_wkb.c | 2 ++ 3 files changed, 24 insertions(+) diff --git a/NEWS b/NEWS index 35345487b..2a5396d7a 100644 --- 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 diff --git a/liblwgeom/cunit/cu_in_wkb.c b/liblwgeom/cunit/cu_in_wkb.c index ff4fb61c0..c938c34d0 100644 --- a/liblwgeom/cunit/cu_in_wkb.c +++ b/liblwgeom/cunit/cu_in_wkb.c @@ -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); } /* diff --git a/liblwgeom/lwin_wkb.c b/liblwgeom/lwin_wkb.c index 051d82405..8f0b235b7 100644 --- a/liblwgeom/lwin_wkb.c +++ b/liblwgeom/lwin_wkb.c @@ -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; } -- 2.40.0