summaryrefslogtreecommitdiffstats
path: root/etc/inc/util.inc
diff options
context:
space:
mode:
Diffstat (limited to 'etc/inc/util.inc')
-rw-r--r--etc/inc/util.inc26
1 files changed, 18 insertions, 8 deletions
diff --git a/etc/inc/util.inc b/etc/inc/util.inc
index 930f9ac..0828bbf 100644
--- a/etc/inc/util.inc
+++ b/etc/inc/util.inc
@@ -198,7 +198,7 @@ function gen_subnet_max($ipaddr, $bits) {
if (!is_ipaddr($ipaddr) || !is_numeric($bits))
return "";
- return long2ip(ip2long($ipaddr) | ~gen_subnet_mask_long($bits));
+ return long2ip32(ip2long($ipaddr) | ~gen_subnet_mask_long($bits));
}
/* returns a subnet mask (long given a bit count) */
@@ -216,9 +216,19 @@ function gen_subnet_mask($bits) {
return long2ip(gen_subnet_mask_long($bits));
}
+/* Convert long int to IP address, truncating to 32-bits. */
+function long2ip32($ip) {
+ return long2ip($ip & 0xFFFFFFFF);
+}
+
+/* Convert IP address to long int, truncated to 32-bits to avoid sign extension on 64-bit platforms. */
+function ip2long32($ip) {
+ return ( ip2long($ip) & 0xFFFFFFFF );
+}
+
/* Convert IP address to unsigned long int. */
function ip2ulong($ip) {
- return sprintf("%u", ip2long($ip));
+ return sprintf("%u", ip2long32($ip));
}
/* Find out how many IPs are contained within a given IP range
@@ -246,12 +256,12 @@ function find_smallest_cidr($number) {
/* Return the previous IP address before the given address */
function ip_before($ip) {
- return long2ip(ip2long($ip)-1);
+ return long2ip32(ip2long($ip)-1);
}
/* Return the next IP address after the given address */
function ip_after($ip) {
- return long2ip(ip2long($ip)+1);
+ return long2ip32(ip2long($ip)+1);
}
/* Return true if the first IP is 'before' the second */
@@ -347,7 +357,7 @@ function is_ipaddr($ipaddr) {
return false;
$ip_long = ip2long($ipaddr);
- $ip_reverse = long2ip($ip_long);
+ $ip_reverse = long2ip32($ip_long);
if ($ipaddr == $ip_reverse)
return true;
@@ -891,9 +901,9 @@ function check_subnets_overlap($subnet1, $bits1, $subnet2, $bits2) {
/* compare two IP addresses */
function ipcmp($a, $b) {
- if (ip2long($a) < ip2long($b))
+ if (ip_less_than($a, $b))
return -1;
- else if (ip2long($a) > ip2long($b))
+ else if (ip_greater_than($a, $b))
return 1;
else
return 0;
@@ -902,7 +912,7 @@ function ipcmp($a, $b) {
/* return true if $addr is in $subnet, false if not */
function ip_in_subnet($addr,$subnet) {
list($ip, $mask) = explode('/', $subnet);
- $mask = 0xffffffff << (32 - $mask);
+ $mask = (0xffffffff << (32 - $mask)) & 0xffffffff;
return ((ip2long($addr) & $mask) == (ip2long($ip) & $mask));
}
OpenPOWER on IntegriCloud