diff --git a/src/backend/utils/adt/network.c b/src/backend/utils/adt/network.c index 52f4e8ecd2..75527fda02 100644 --- a/src/backend/utils/adt/network.c +++ b/src/backend/utils/adt/network.c @@ -3,7 +3,7 @@ * is for IP V4 CIDR notation, but prepared for V6: just * add the necessary bits where the comments indicate. * - * $Header: /cvsroot/pgsql/src/backend/utils/adt/network.c,v 1.26 2000/11/10 20:13:25 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/network.c,v 1.27 2000/11/25 21:30:54 tgl Exp $ * * Jon Postel RIP 16 Oct 1998 */ @@ -418,7 +418,13 @@ network_broadcast(PG_FUNCTION_ARGS) /* It's an IP V4 address: */ unsigned long mask = 0xffffffff; - mask >>= ip_bits(ip); + /* Shifting by 32 or more bits does not yield portable results, + * so don't try it. + */ + if (ip_bits(ip) < 32) + mask >>= ip_bits(ip); + else + mask = 0; ip_v4addr(dst) = htonl(ntohl(ip_v4addr(ip)) | mask); } @@ -451,7 +457,13 @@ network_network(PG_FUNCTION_ARGS) /* It's an IP V4 address: */ unsigned long mask = 0xffffffff; - mask <<= (32 - ip_bits(ip)); + /* Shifting by 32 or more bits does not yield portable results, + * so don't try it. + */ + if (ip_bits(ip) > 0) + mask <<= (32 - ip_bits(ip)); + else + mask = 0; ip_v4addr(dst) = htonl(ntohl(ip_v4addr(ip)) & mask); } @@ -484,7 +496,13 @@ network_netmask(PG_FUNCTION_ARGS) /* It's an IP V4 address: */ unsigned long mask = 0xffffffff; - mask <<= (32 - ip_bits(ip)); + /* Shifting by 32 or more bits does not yield portable results, + * so don't try it. + */ + if (ip_bits(ip) > 0) + mask <<= (32 - ip_bits(ip)); + else + mask = 0; ip_v4addr(dst) = htonl(mask); @@ -512,7 +530,13 @@ v4bitncmp(unsigned long a1, unsigned long a2, int bits) { unsigned long mask; - mask = (0xFFFFFFFFL << (32 - bits)) & 0xFFFFFFFFL; + /* Shifting by 32 or more bits does not yield portable results, + * so don't try it. + */ + if (bits > 0) + mask = (0xFFFFFFFFL << (32 - bits)) & 0xFFFFFFFFL; + else + mask = 0; a1 = ntohl(a1); a2 = ntohl(a2); if ((a1 & mask) < (a2 & mask)) @@ -530,7 +554,13 @@ v4addressOK(unsigned long a1, int bits) { unsigned long mask; - mask = (0xFFFFFFFFL << (32 - bits)) & 0xFFFFFFFFL; + /* Shifting by 32 or more bits does not yield portable results, + * so don't try it. + */ + if (bits > 0) + mask = (0xFFFFFFFFL << (32 - bits)) & 0xFFFFFFFFL; + else + mask = 0; a1 = ntohl(a1); if ((a1 & mask) == a1) return true;