diff options
author | Heikki Linnakangas | 2013-09-25 13:02:00 +0000 |
---|---|---|
committer | Heikki Linnakangas | 2013-09-25 13:02:00 +0000 |
commit | 77ae7f7c356064f5355e004b95f485358dfc1360 (patch) | |
tree | bdd420b6d7a82a3dbae163baaccd54b805e6d136 | |
parent | b2fc4d6142033e361dee91388d9515be3633763c (diff) |
Plug memory leak in range_cmp function.
B-tree operators are not allowed to leak memory into the current memory
context. Range_cmp leaked detoasted copies of the arguments. That caused
a quick out-of-memory error when creating an index on a range column.
Reported by Marian Krucina, bug #8468.
-rw-r--r-- | src/backend/utils/adt/rangetypes.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/backend/utils/adt/rangetypes.c b/src/backend/utils/adt/rangetypes.c index cd5c5f6621c..023df8c3e9e 100644 --- a/src/backend/utils/adt/rangetypes.c +++ b/src/backend/utils/adt/rangetypes.c @@ -1125,16 +1125,22 @@ range_cmp(PG_FUNCTION_ARGS) /* For b-tree use, empty ranges sort before all else */ if (empty1 && empty2) - PG_RETURN_INT32(0); + cmp = 0; else if (empty1) - PG_RETURN_INT32(-1); + cmp = -1; else if (empty2) - PG_RETURN_INT32(1); + cmp = 1; + else + { + cmp = range_cmp_bounds(typcache, &lower1, &lower2); + if (cmp == 0) + cmp = range_cmp_bounds(typcache, &upper1, &upper2); + } - if ((cmp = range_cmp_bounds(typcache, &lower1, &lower2)) != 0) - PG_RETURN_INT32(cmp); + PG_FREE_IF_COPY(r1, 0); + PG_FREE_IF_COPY(r2, 1); - PG_RETURN_INT32(range_cmp_bounds(typcache, &upper1, &upper2)); + PG_RETURN_INT32(cmp); } /* inequality operators using the range_cmp function */ |