summaryrefslogtreecommitdiff
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:05:29 +0200
commit81f4e6cd27d538bc27e9714a9173e4df353a02e5 (patch)
tree6ba82efcecb8dfa48b181e511bf84b2683113f79
parent28b78e8863bbec8a0e13c067df98d543c0084e7b (diff)
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 9a369a713ff..81d05aa8aea 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 945cc580381..f67932b15d2 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))