Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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:05:24 +0000 (10:05 +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 cd979464e6630354eb98a37d2f1c9686f2d0e84a..e80ace7d5a249911ccc3a98f37481a89be0262f2 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 2a526a3c80772c6a90bf85b9ec172ab67e14203d..261574b073ae38aa750496f2eda32cfecea8050b 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))