From: Paul Ramsey Date: Fri, 26 Jan 2018 12:47:38 +0000 (+0000) Subject: Avoid memory exhaustion when building a btree index (references #4004) X-Git-Tag: 2.4.4~26 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7c780482931daa82da120c3307cc9c530f667777;p=postgis Avoid memory exhaustion when building a btree index (references #4004) From Edmund Horner git-svn-id: http://svn.osgeo.org/postgis/branches/2.4@16361 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/NEWS b/NEWS index e14b44d58..ada83ba4e 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ PostGIS 2.4.4dev * Bug fixes * - #3978, Fix KNN when upgrading from 2.1 or older (Sandro Santilli) + - #4004, Avoid memory exhaustion when building a btree index (Edmund Horner) PostGIS 2.3.6 2018/01/17 diff --git a/postgis/geography_btree.c b/postgis/geography_btree.c index 5d98a7e17..53888dbda 100644 --- a/postgis/geography_btree.c +++ b/postgis/geography_btree.c @@ -51,6 +51,8 @@ Datum geography_lt(PG_FUNCTION_ARGS) GSERIALIZED *g1 = PG_GETARG_GSERIALIZED_P(0); GSERIALIZED *g2 = PG_GETARG_GSERIALIZED_P(1); int cmp = gserialized_cmp(g1, g2); + PG_FREE_IF_COPY(g1, 0); + PG_FREE_IF_COPY(g2, 1); if (cmp < 0) PG_RETURN_BOOL(TRUE); else @@ -67,6 +69,8 @@ Datum geography_le(PG_FUNCTION_ARGS) GSERIALIZED *g1 = PG_GETARG_GSERIALIZED_P(0); GSERIALIZED *g2 = PG_GETARG_GSERIALIZED_P(1); int cmp = gserialized_cmp(g1, g2); + PG_FREE_IF_COPY(g1, 0); + PG_FREE_IF_COPY(g2, 1); if (cmp <= 0) PG_RETURN_BOOL(TRUE); else @@ -83,6 +87,8 @@ Datum geography_gt(PG_FUNCTION_ARGS) GSERIALIZED *g1 = PG_GETARG_GSERIALIZED_P(0); GSERIALIZED *g2 = PG_GETARG_GSERIALIZED_P(1); int cmp = gserialized_cmp(g1, g2); + PG_FREE_IF_COPY(g1, 0); + PG_FREE_IF_COPY(g2, 1); if (cmp > 0) PG_RETURN_BOOL(TRUE); else @@ -99,6 +105,8 @@ Datum geography_ge(PG_FUNCTION_ARGS) GSERIALIZED *g1 = PG_GETARG_GSERIALIZED_P(0); GSERIALIZED *g2 = PG_GETARG_GSERIALIZED_P(1); int cmp = gserialized_cmp(g1, g2); + PG_FREE_IF_COPY(g1, 0); + PG_FREE_IF_COPY(g2, 1); if (cmp >= 0) PG_RETURN_BOOL(TRUE); else @@ -115,6 +123,8 @@ Datum geography_eq(PG_FUNCTION_ARGS) GSERIALIZED *g1 = PG_GETARG_GSERIALIZED_P(0); GSERIALIZED *g2 = PG_GETARG_GSERIALIZED_P(1); int cmp = gserialized_cmp(g1, g2); + PG_FREE_IF_COPY(g1, 0); + PG_FREE_IF_COPY(g2, 1); if (cmp == 0) PG_RETURN_BOOL(TRUE); else @@ -130,5 +140,8 @@ Datum geography_cmp(PG_FUNCTION_ARGS) { GSERIALIZED *g1 = PG_GETARG_GSERIALIZED_P(0); GSERIALIZED *g2 = PG_GETARG_GSERIALIZED_P(1); - PG_RETURN_INT32(gserialized_cmp(g1, g2)); + int ret = gserialized_cmp(g1, g2); + PG_FREE_IF_COPY(g1, 0); + PG_FREE_IF_COPY(g2, 1); + PG_RETURN_INT32(ret); }