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:
parent
0f44335122
commit
8409b60476
@ -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))
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user