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.
This commit is contained in:
Heikki Linnakangas 2011-12-12 09:49:47 +02:00
parent 0f44335122
commit 8409b60476
2 changed files with 50 additions and 50 deletions

View File

@ -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))

View File

@ -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))