]> granicus.if.org Git - postgis/commitdiff
Avoid memory exhaustion when building a btree index (references #4004)
authorPaul Ramsey <pramsey@cleverelephant.ca>
Fri, 26 Jan 2018 12:47:38 +0000 (12:47 +0000)
committerPaul Ramsey <pramsey@cleverelephant.ca>
Fri, 26 Jan 2018 12:47:38 +0000 (12:47 +0000)
From Edmund Horner

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

NEWS
postgis/geography_btree.c

diff --git a/NEWS b/NEWS
index e14b44d5830a0eaf35d26f14840259aca29f1bc0..ada83ba4e4cf50372518a42d5fd3d2e5875560a3 100644 (file)
--- 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
index 5d98a7e170d2752d36a2839422a09df38c778fc0..53888dbdad22dd72670d95ab79425885cba62fda 100644 (file)
@@ -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);
 }