aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2011-12-12 09:49:47 +0200
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2011-12-12 10:10:53 +0200
commit8409b60476a4112e654d1a5099dd67a54f197afd (patch)
tree6451e0492f945e38a69b0517ff16ec7448aacf4d
parent0f44335122fd01b54417bc955d6a98b967ca832c (diff)
downloadpostgresql-8409b60476a4112e654d1a5099dd67a54f197afd.tar.gz
postgresql-8409b60476a4112e654d1a5099dd67a54f197afd.zip
Revert the behavior of inet/cidr functions to not unpack the arguments.
I forgot to change the functions to use the PG_GETARG_INET_PP() macro, when I changed DatumGetInetP() to unpack the datum, like Datum*P macros usually do. Also, I screwed up the definition of the PG_GETARG_INET_PP() macro, and didn't notice because it wasn't used. This fixes the memory leak when sorting inet values, as reported by Jochen Erwied and debugged by Andres Freund. Backpatch to 8.3, like the previous patch that broke it.
-rw-r--r--src/backend/utils/adt/network.c98
-rw-r--r--src/include/utils/inet.h2
2 files changed, 50 insertions, 50 deletions
diff --git a/src/backend/utils/adt/network.c b/src/backend/utils/adt/network.c
index e929d6beff0..f2c337cb8d1 100644
--- a/src/backend/utils/adt/network.c
+++ b/src/backend/utils/adt/network.c
@@ -172,7 +172,7 @@ network_out(inet *src, bool is_cidr)
Datum
inet_out(PG_FUNCTION_ARGS)
{
- inet *src = PG_GETARG_INET_P(0);
+ inet *src = PG_GETARG_INET_PP(0);
PG_RETURN_CSTRING(network_out(src, false));
}
@@ -180,7 +180,7 @@ inet_out(PG_FUNCTION_ARGS)
Datum
cidr_out(PG_FUNCTION_ARGS)
{
- inet *src = PG_GETARG_INET_P(0);
+ inet *src = PG_GETARG_INET_PP(0);
PG_RETURN_CSTRING(network_out(src, true));
}
@@ -299,7 +299,7 @@ network_send(inet *addr, bool is_cidr)
Datum
inet_send(PG_FUNCTION_ARGS)
{
- inet *addr = PG_GETARG_INET_P(0);
+ inet *addr = PG_GETARG_INET_PP(0);
PG_RETURN_BYTEA_P(network_send(addr, false));
}
@@ -307,7 +307,7 @@ inet_send(PG_FUNCTION_ARGS)
Datum
cidr_send(PG_FUNCTION_ARGS)
{
- inet *addr = PG_GETARG_INET_P(0);
+ inet *addr = PG_GETARG_INET_PP(0);
PG_RETURN_BYTEA_P(network_send(addr, true));
}
@@ -316,7 +316,7 @@ cidr_send(PG_FUNCTION_ARGS)
Datum
inet_to_cidr(PG_FUNCTION_ARGS)
{
- inet *src = PG_GETARG_INET_P(0);
+ inet *src = PG_GETARG_INET_PP(0);
inet *dst;
int bits;
int byte;
@@ -357,7 +357,7 @@ inet_to_cidr(PG_FUNCTION_ARGS)
Datum
inet_set_masklen(PG_FUNCTION_ARGS)
{
- inet *src = PG_GETARG_INET_P(0);
+ inet *src = PG_GETARG_INET_PP(0);
int bits = PG_GETARG_INT32(1);
inet *dst;
@@ -381,7 +381,7 @@ inet_set_masklen(PG_FUNCTION_ARGS)
Datum
cidr_set_masklen(PG_FUNCTION_ARGS)
{
- inet *src = PG_GETARG_INET_P(0);
+ inet *src = PG_GETARG_INET_PP(0);
int bits = PG_GETARG_INT32(1);
inet *dst;
int byte;
@@ -457,8 +457,8 @@ network_cmp_internal(inet *a1, inet *a2)
Datum
network_cmp(PG_FUNCTION_ARGS)
{
- inet *a1 = PG_GETARG_INET_P(0);
- inet *a2 = PG_GETARG_INET_P(1);
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
PG_RETURN_INT32(network_cmp_internal(a1, a2));
}
@@ -469,8 +469,8 @@ network_cmp(PG_FUNCTION_ARGS)
Datum
network_lt(PG_FUNCTION_ARGS)
{
- inet *a1 = PG_GETARG_INET_P(0);
- inet *a2 = PG_GETARG_INET_P(1);
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
PG_RETURN_BOOL(network_cmp_internal(a1, a2) < 0);
}
@@ -478,8 +478,8 @@ network_lt(PG_FUNCTION_ARGS)
Datum
network_le(PG_FUNCTION_ARGS)
{
- inet *a1 = PG_GETARG_INET_P(0);
- inet *a2 = PG_GETARG_INET_P(1);
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
PG_RETURN_BOOL(network_cmp_internal(a1, a2) <= 0);
}
@@ -487,8 +487,8 @@ network_le(PG_FUNCTION_ARGS)
Datum
network_eq(PG_FUNCTION_ARGS)
{
- inet *a1 = PG_GETARG_INET_P(0);
- inet *a2 = PG_GETARG_INET_P(1);
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
PG_RETURN_BOOL(network_cmp_internal(a1, a2) == 0);
}
@@ -496,8 +496,8 @@ network_eq(PG_FUNCTION_ARGS)
Datum
network_ge(PG_FUNCTION_ARGS)
{
- inet *a1 = PG_GETARG_INET_P(0);
- inet *a2 = PG_GETARG_INET_P(1);
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
PG_RETURN_BOOL(network_cmp_internal(a1, a2) >= 0);
}
@@ -505,8 +505,8 @@ network_ge(PG_FUNCTION_ARGS)
Datum
network_gt(PG_FUNCTION_ARGS)
{
- inet *a1 = PG_GETARG_INET_P(0);
- inet *a2 = PG_GETARG_INET_P(1);
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
PG_RETURN_BOOL(network_cmp_internal(a1, a2) > 0);
}
@@ -514,8 +514,8 @@ network_gt(PG_FUNCTION_ARGS)
Datum
network_ne(PG_FUNCTION_ARGS)
{
- inet *a1 = PG_GETARG_INET_P(0);
- inet *a2 = PG_GETARG_INET_P(1);
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
PG_RETURN_BOOL(network_cmp_internal(a1, a2) != 0);
}
@@ -526,7 +526,7 @@ network_ne(PG_FUNCTION_ARGS)
Datum
hashinet(PG_FUNCTION_ARGS)
{
- inet *addr = PG_GETARG_INET_P(0);
+ inet *addr = PG_GETARG_INET_PP(0);
int addrsize = ip_addrsize(addr);
/* XXX this assumes there are no pad bytes in the data structure */
@@ -539,8 +539,8 @@ hashinet(PG_FUNCTION_ARGS)
Datum
network_sub(PG_FUNCTION_ARGS)
{
- inet *a1 = PG_GETARG_INET_P(0);
- inet *a2 = PG_GETARG_INET_P(1);
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
if (ip_family(a1) == ip_family(a2))
{
@@ -554,8 +554,8 @@ network_sub(PG_FUNCTION_ARGS)
Datum
network_subeq(PG_FUNCTION_ARGS)
{
- inet *a1 = PG_GETARG_INET_P(0);
- inet *a2 = PG_GETARG_INET_P(1);
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
if (ip_family(a1) == ip_family(a2))
{
@@ -569,8 +569,8 @@ network_subeq(PG_FUNCTION_ARGS)
Datum
network_sup(PG_FUNCTION_ARGS)
{
- inet *a1 = PG_GETARG_INET_P(0);
- inet *a2 = PG_GETARG_INET_P(1);
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
if (ip_family(a1) == ip_family(a2))
{
@@ -584,8 +584,8 @@ network_sup(PG_FUNCTION_ARGS)
Datum
network_supeq(PG_FUNCTION_ARGS)
{
- inet *a1 = PG_GETARG_INET_P(0);
- inet *a2 = PG_GETARG_INET_P(1);
+ inet *a1 = PG_GETARG_INET_PP(0);
+ inet *a2 = PG_GETARG_INET_PP(1);
if (ip_family(a1) == ip_family(a2))
{
@@ -602,7 +602,7 @@ network_supeq(PG_FUNCTION_ARGS)
Datum
network_host(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
+ inet *ip = PG_GETARG_INET_PP(0);
char *ptr;
char tmp[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")];
@@ -628,7 +628,7 @@ network_host(PG_FUNCTION_ARGS)
Datum
network_show(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
+ inet *ip = PG_GETARG_INET_PP(0);
int len;
char tmp[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")];
@@ -651,7 +651,7 @@ network_show(PG_FUNCTION_ARGS)
Datum
inet_abbrev(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
+ inet *ip = PG_GETARG_INET_PP(0);
char *dst;
char tmp[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")];
@@ -669,7 +669,7 @@ inet_abbrev(PG_FUNCTION_ARGS)
Datum
cidr_abbrev(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
+ inet *ip = PG_GETARG_INET_PP(0);
char *dst;
char tmp[sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:255.255.255.255/128")];
@@ -687,7 +687,7 @@ cidr_abbrev(PG_FUNCTION_ARGS)
Datum
network_masklen(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
+ inet *ip = PG_GETARG_INET_PP(0);
PG_RETURN_INT32(ip_bits(ip));
}
@@ -695,7 +695,7 @@ network_masklen(PG_FUNCTION_ARGS)
Datum
network_family(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
+ inet *ip = PG_GETARG_INET_PP(0);
switch (ip_family(ip))
{
@@ -714,7 +714,7 @@ network_family(PG_FUNCTION_ARGS)
Datum
network_broadcast(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
+ inet *ip = PG_GETARG_INET_PP(0);
inet *dst;
int byte;
int bits;
@@ -763,7 +763,7 @@ network_broadcast(PG_FUNCTION_ARGS)
Datum
network_network(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
+ inet *ip = PG_GETARG_INET_PP(0);
inet *dst;
int byte;
int bits;
@@ -807,7 +807,7 @@ network_network(PG_FUNCTION_ARGS)
Datum
network_netmask(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
+ inet *ip = PG_GETARG_INET_PP(0);
inet *dst;
int byte;
int bits;
@@ -849,7 +849,7 @@ network_netmask(PG_FUNCTION_ARGS)
Datum
network_hostmask(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
+ inet *ip = PG_GETARG_INET_PP(0);
inet *dst;
int byte;
int bits;
@@ -1218,7 +1218,7 @@ inet_server_port(PG_FUNCTION_ARGS)
Datum
inetnot(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
+ inet *ip = PG_GETARG_INET_PP(0);
inet *dst;
dst = (inet *) palloc0(sizeof(inet));
@@ -1243,8 +1243,8 @@ inetnot(PG_FUNCTION_ARGS)
Datum
inetand(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
- inet *ip2 = PG_GETARG_INET_P(1);
+ inet *ip = PG_GETARG_INET_PP(0);
+ inet *ip2 = PG_GETARG_INET_PP(1);
inet *dst;
dst = (inet *) palloc0(sizeof(inet));
@@ -1275,8 +1275,8 @@ inetand(PG_FUNCTION_ARGS)
Datum
inetor(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
- inet *ip2 = PG_GETARG_INET_P(1);
+ inet *ip = PG_GETARG_INET_PP(0);
+ inet *ip2 = PG_GETARG_INET_PP(1);
inet *dst;
dst = (inet *) palloc0(sizeof(inet));
@@ -1359,7 +1359,7 @@ internal_inetpl(inet *ip, int64 addend)
Datum
inetpl(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
+ inet *ip = PG_GETARG_INET_PP(0);
int64 addend = PG_GETARG_INT64(1);
PG_RETURN_INET_P(internal_inetpl(ip, addend));
@@ -1369,7 +1369,7 @@ inetpl(PG_FUNCTION_ARGS)
Datum
inetmi_int8(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
+ inet *ip = PG_GETARG_INET_PP(0);
int64 addend = PG_GETARG_INT64(1);
PG_RETURN_INET_P(internal_inetpl(ip, -addend));
@@ -1379,8 +1379,8 @@ inetmi_int8(PG_FUNCTION_ARGS)
Datum
inetmi(PG_FUNCTION_ARGS)
{
- inet *ip = PG_GETARG_INET_P(0);
- inet *ip2 = PG_GETARG_INET_P(1);
+ inet *ip = PG_GETARG_INET_PP(0);
+ inet *ip2 = PG_GETARG_INET_PP(1);
int64 res = 0;
if (ip_family(ip) != ip_family(ip2))
diff --git a/src/include/utils/inet.h b/src/include/utils/inet.h
index fa217b66116..bf982f67ee7 100644
--- a/src/include/utils/inet.h
+++ b/src/include/utils/inet.h
@@ -74,7 +74,7 @@ typedef struct macaddr
#define DatumGetInetPP(X) ((inet *) PG_DETOAST_DATUM_PACKED(X))
#define InetPGetDatum(X) PointerGetDatum(X)
#define PG_GETARG_INET_P(n) DatumGetInetP(PG_GETARG_DATUM(n))
-#define PG_GETARG_INET_PP(n) DatumGetInetP(PG_GETARG_DATUM_PACKED(n))
+#define PG_GETARG_INET_PP(n) DatumGetInetPP(PG_GETARG_DATUM(n))
#define PG_RETURN_INET_P(x) return InetPGetDatum(x)
/* macaddr is a fixed-length pass-by-reference datatype */
#define DatumGetMacaddrP(X) ((macaddr *) DatumGetPointer(X))