Revert the behavior of inet/cidr functions to not unpack the arguments.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 12 Dec 2011 07:49:47 +0000 (09:49 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 12 Dec 2011 08:10:53 +0000 (10:10 +0200)
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
src/include/utils/inet.h

index e929d6beff0e35ca53a960d0796247171b60155a..f2c337cb8d13e6c489833699dc3d2f916d1bda2d 100644 (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))
index fa217b6611698ffbd6840a43a2ef8dc0c276447e..bf982f67ee73e0cbac0afd9a07af95c66bb6111b 100644 (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))