From 8409b60476a4112e654d1a5099dd67a54f197afd Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Mon, 12 Dec 2011 09:49:47 +0200 Subject: [PATCH] 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. --- src/backend/utils/adt/network.c | 98 ++++++++++++++++----------------- src/include/utils/inet.h | 2 +- 2 files changed, 50 insertions(+), 50 deletions(-) diff --git a/src/backend/utils/adt/network.c b/src/backend/utils/adt/network.c index e929d6beff..f2c337cb8d 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 fa217b6611..bf982f67ee 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))