From 1cc6b5162c1039012f42905fdf0eefd4022cd13c Mon Sep 17 00:00:00 2001 From: tjhunt Date: Mon, 1 Sep 2008 04:17:11 +0000 Subject: [PATCH] MDL-15655 - address_in_subnet does not work on 64 bit architectures. Also, we found some other issues with this funtion while diagnosing the problem. --- lib/moodlelib.php | 8 +++++++- lib/simpletest/testmoodlelib.php | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/moodlelib.php b/lib/moodlelib.php index 5b8b52489e..8480e5739d 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -7227,6 +7227,9 @@ function address_in_subnet($addr, $subnetstr) { $subnet = trim($subnet); if (strpos($subnet, '/') !== false) { /// type 1 list($ip, $mask) = explode('/', $subnet); + if ($mask === '') { + $mask = 32; + } $mask = 0xffffffff << (32 - $mask); $found = ((ip2long($addr) & $mask) == (ip2long($ip) & $mask)); } else if (strpos($subnet, '-') !== false) {/// type 3 @@ -7239,7 +7242,10 @@ function address_in_subnet($addr, $subnetstr) { $subnetrange[0] <= $lastaddrpart && $lastaddrpart <= $subnetrange[1]); } } else { /// type 2 - $found = (strpos($addr, $subnet) === 0); + if ($subnet[strlen($subnet) - 1] != '.') { + $subnet .= '.'; + } + $found = (strpos($addr . '.', $subnet) === 0); } if ($found) { diff --git a/lib/simpletest/testmoodlelib.php b/lib/simpletest/testmoodlelib.php index 05273e6e23..bdeb7cda5f 100644 --- a/lib/simpletest/testmoodlelib.php +++ b/lib/simpletest/testmoodlelib.php @@ -80,9 +80,15 @@ class moodlelib_test extends UnitTestCase { $this->assertTrue(address_in_subnet('123.121.234.15', '123.121.234.2/28')); $this->assertFalse(address_in_subnet('123.121.234.16', '123.121.234.2/28')); $this->assertFalse(address_in_subnet('123.121.234.255', '123.121.234.2/28')); - $this->assertTrue(address_in_subnet('123.121.234.1', '123.121.')); + $this->assertTrue(address_in_subnet('123.121.234.0', '123.121.234.0/')); // / is like /32. + $this->assertFalse(address_in_subnet('123.121.234.1', '123.121.234.0/')); + $this->assertFalse(address_in_subnet('232.232.232.232', '123.121.234.0/0')); $this->assertFalse(address_in_subnet('123.122.234.1', '123.121.')); $this->assertFalse(address_in_subnet('223.121.234.1', '123.121.')); + $this->assertTrue(address_in_subnet('123.121.234.1', '123.121')); + $this->assertFalse(address_in_subnet('123.122.234.1', '123.121')); + $this->assertFalse(address_in_subnet('223.121.234.1', '123.121')); + $this->assertFalse(address_in_subnet('123.121.234.100', '123.121.234.10')); $this->assertFalse(address_in_subnet('123.121.234.9', '123.121.234.10-20')); $this->assertTrue(address_in_subnet('123.121.234.10', '123.121.234.10-20')); $this->assertTrue(address_in_subnet('123.121.234.15', '123.121.234.10-20')); -- 2.39.5