From 8409b60476a4112e654d1a5099dd67a54f197afd Mon Sep 17 00:00:00 2001
From: Heikki Linnakangas <heikki.linnakangas@iki.fi>
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 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))
-- 
GitLab