diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2000-12-08 23:57:03 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2000-12-08 23:57:03 +0000 |
commit | 376784cf8ac7dee831471d7fd4159145d135636b (patch) | |
tree | 62008e893458d778777a871f672c5545d5c9b241 /src/backend/utils/adt | |
parent | fb47385fc8d2314dd7d23d691959c882ead1c31a (diff) | |
download | postgresql-376784cf8ac7dee831471d7fd4159145d135636b.tar.gz postgresql-376784cf8ac7dee831471d7fd4159145d135636b.zip |
Repair erroneous use of hashvarlena() for MACADDR, which is not a
varlena type. (I did not force initdb, but you won't see the fix
unless you do one.) Also, make sure all index support operators and
functions are careful not to leak memory for toasted inputs; I had
missed some hash and rtree support ops on this point before.
Diffstat (limited to 'src/backend/utils/adt')
-rw-r--r-- | src/backend/utils/adt/geo_ops.c | 94 | ||||
-rw-r--r-- | src/backend/utils/adt/mac.c | 15 | ||||
-rw-r--r-- | src/backend/utils/adt/varchar.c | 10 |
3 files changed, 96 insertions, 23 deletions
diff --git a/src/backend/utils/adt/geo_ops.c b/src/backend/utils/adt/geo_ops.c index 3a5591ba5d2..d120442cc5a 100644 --- a/src/backend/utils/adt/geo_ops.c +++ b/src/backend/utils/adt/geo_ops.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.55 2000/12/03 20:45:35 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/geo_ops.c,v 1.56 2000/12/08 23:57:03 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -3097,8 +3097,15 @@ poly_left(PG_FUNCTION_ARGS) { POLYGON *polya = PG_GETARG_POLYGON_P(0); POLYGON *polyb = PG_GETARG_POLYGON_P(1); + bool result; - PG_RETURN_BOOL(polya->boundbox.high.x < polyb->boundbox.low.x); + result = polya->boundbox.high.x < polyb->boundbox.low.x; + + /* Avoid leaking memory for toasted inputs ... needed for rtree indexes */ + PG_FREE_IF_COPY(polya, 0); + PG_FREE_IF_COPY(polyb, 1); + + PG_RETURN_BOOL(result); } /*------------------------------------------------------- @@ -3111,8 +3118,15 @@ poly_overleft(PG_FUNCTION_ARGS) { POLYGON *polya = PG_GETARG_POLYGON_P(0); POLYGON *polyb = PG_GETARG_POLYGON_P(1); + bool result; + + result = polya->boundbox.low.x <= polyb->boundbox.high.x; - PG_RETURN_BOOL(polya->boundbox.low.x <= polyb->boundbox.high.x); + /* Avoid leaking memory for toasted inputs ... needed for rtree indexes */ + PG_FREE_IF_COPY(polya, 0); + PG_FREE_IF_COPY(polyb, 1); + + PG_RETURN_BOOL(result); } /*------------------------------------------------------- @@ -3125,8 +3139,15 @@ poly_right(PG_FUNCTION_ARGS) { POLYGON *polya = PG_GETARG_POLYGON_P(0); POLYGON *polyb = PG_GETARG_POLYGON_P(1); + bool result; + + result = polya->boundbox.low.x > polyb->boundbox.high.x; + + /* Avoid leaking memory for toasted inputs ... needed for rtree indexes */ + PG_FREE_IF_COPY(polya, 0); + PG_FREE_IF_COPY(polyb, 1); - PG_RETURN_BOOL(polya->boundbox.low.x > polyb->boundbox.high.x); + PG_RETURN_BOOL(result); } /*------------------------------------------------------- @@ -3139,8 +3160,15 @@ poly_overright(PG_FUNCTION_ARGS) { POLYGON *polya = PG_GETARG_POLYGON_P(0); POLYGON *polyb = PG_GETARG_POLYGON_P(1); + bool result; - PG_RETURN_BOOL(polya->boundbox.high.x > polyb->boundbox.low.x); + result = polya->boundbox.high.x > polyb->boundbox.low.x; + + /* Avoid leaking memory for toasted inputs ... needed for rtree indexes */ + PG_FREE_IF_COPY(polya, 0); + PG_FREE_IF_COPY(polyb, 1); + + PG_RETURN_BOOL(result); } /*------------------------------------------------------- @@ -3155,11 +3183,18 @@ poly_same(PG_FUNCTION_ARGS) { POLYGON *polya = PG_GETARG_POLYGON_P(0); POLYGON *polyb = PG_GETARG_POLYGON_P(1); + bool result; if (polya->npts != polyb->npts) - PG_RETURN_BOOL(false); + result = false; + else + result = plist_same(polya->npts, polya->p, polyb->p); + + /* Avoid leaking memory for toasted inputs ... needed for rtree indexes */ + PG_FREE_IF_COPY(polya, 0); + PG_FREE_IF_COPY(polyb, 1); - PG_RETURN_BOOL(plist_same(polya->npts, polya->p, polyb->p)); + PG_RETURN_BOOL(result); } /*----------------------------------------------------------------- @@ -3173,8 +3208,15 @@ poly_overlap(PG_FUNCTION_ARGS) { POLYGON *polya = PG_GETARG_POLYGON_P(0); POLYGON *polyb = PG_GETARG_POLYGON_P(1); + bool result; + + result = box_ov(&polya->boundbox, &polyb->boundbox); - PG_RETURN_BOOL(box_ov(&polya->boundbox, &polyb->boundbox)); + /* Avoid leaking memory for toasted inputs ... needed for rtree indexes */ + PG_FREE_IF_COPY(polya, 0); + PG_FREE_IF_COPY(polyb, 1); + + PG_RETURN_BOOL(result); } @@ -3186,6 +3228,7 @@ poly_contain(PG_FUNCTION_ARGS) { POLYGON *polya = PG_GETARG_POLYGON_P(0); POLYGON *polyb = PG_GETARG_POLYGON_P(1); + bool result; int i; /* @@ -3195,6 +3238,7 @@ poly_contain(PG_FUNCTION_ARGS) BoxPGetDatum(&polya->boundbox), BoxPGetDatum(&polyb->boundbox)))) { + result = true; /* assume true for now */ for (i = 0; i < polyb->npts; i++) { if (point_inside(&(polyb->p[i]), polya->npts, &(polya->p[0])) == 0) @@ -3202,28 +3246,40 @@ poly_contain(PG_FUNCTION_ARGS) #if GEODEBUG printf("poly_contain- point (%f,%f) not in polygon\n", polyb->p[i].x, polyb->p[i].y); #endif - PG_RETURN_BOOL(false); + result = false; + break; } } - for (i = 0; i < polya->npts; i++) + if (result) { - if (point_inside(&(polya->p[i]), polyb->npts, &(polyb->p[0])) == 1) + for (i = 0; i < polya->npts; i++) { + if (point_inside(&(polya->p[i]), polyb->npts, &(polyb->p[0])) == 1) + { #if GEODEBUG - printf("poly_contain- point (%f,%f) in polygon\n", polya->p[i].x, polya->p[i].y); + printf("poly_contain- point (%f,%f) in polygon\n", polya->p[i].x, polya->p[i].y); #endif - PG_RETURN_BOOL(false); + result = false; + break; + } } } - PG_RETURN_BOOL(true); } - + else + { #if GEODEBUG - printf("poly_contain- bound box ((%f,%f),(%f,%f)) not inside ((%f,%f),(%f,%f))\n", - polyb->boundbox.low.x, polyb->boundbox.low.y, polyb->boundbox.high.x, polyb->boundbox.high.y, - polya->boundbox.low.x, polya->boundbox.low.y, polya->boundbox.high.x, polya->boundbox.high.y); + printf("poly_contain- bound box ((%f,%f),(%f,%f)) not inside ((%f,%f),(%f,%f))\n", + polyb->boundbox.low.x, polyb->boundbox.low.y, polyb->boundbox.high.x, polyb->boundbox.high.y, + polya->boundbox.low.x, polya->boundbox.low.y, polya->boundbox.high.x, polya->boundbox.high.y); #endif - PG_RETURN_BOOL(false); + result = false; + } + + /* Avoid leaking memory for toasted inputs ... needed for rtree indexes */ + PG_FREE_IF_COPY(polya, 0); + PG_FREE_IF_COPY(polyb, 1); + + PG_RETURN_BOOL(result); } diff --git a/src/backend/utils/adt/mac.c b/src/backend/utils/adt/mac.c index 5e949ea2e6e..17754588e97 100644 --- a/src/backend/utils/adt/mac.c +++ b/src/backend/utils/adt/mac.c @@ -1,11 +1,12 @@ /* * PostgreSQL type definitions for MAC addresses. * - * $Header: /cvsroot/pgsql/src/backend/utils/adt/mac.c,v 1.18 2000/08/23 06:04:33 thomas Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/mac.c,v 1.19 2000/12/08 23:57:03 tgl Exp $ */ #include "postgres.h" +#include "access/hash.h" #include "utils/builtins.h" #include "utils/inet.h" @@ -237,10 +238,20 @@ macaddr_ne(PG_FUNCTION_ARGS) } /* + * Support function for hash indexes on macaddr. + */ +Datum +hashmacaddr(PG_FUNCTION_ARGS) +{ + macaddr *key = PG_GETARG_MACADDR_P(0); + + return hash_any((char *) key, sizeof(macaddr)); +} + +/* * Truncation function to allow comparing mac manufacturers. * From suggestion by Alex Pilosov <alex@pilosoft.com> */ - Datum macaddr_trunc(PG_FUNCTION_ARGS) { diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c index 3c58a254619..750d3dd665e 100644 --- a/src/backend/utils/adt/varchar.c +++ b/src/backend/utils/adt/varchar.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.71 2000/11/26 11:35:23 ishii Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varchar.c,v 1.72 2000/12/08 23:57:03 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -663,11 +663,17 @@ hashbpchar(PG_FUNCTION_ARGS) BpChar *key = PG_GETARG_BPCHAR_P(0); char *keydata; int keylen; + Datum result; keydata = VARDATA(key); keylen = bcTruelen(key); - return hash_any(keydata, keylen); + result = hash_any(keydata, keylen); + + /* Avoid leaking memory for toasted inputs */ + PG_FREE_IF_COPY(key, 0); + + return result; } |