Skip to content

Commit

Permalink
Fix end address of ranges built by rangesFromBoundaries()
Browse files Browse the repository at this point in the history
  • Loading branch information
mlocati committed May 26, 2021
1 parent a2a3bdf commit 3763f50
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 2 deletions.
9 changes: 7 additions & 2 deletions src/Service/RangesFromBoundaryCalculator.php
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,13 @@ private function addressFromBits($bits)
*/
private function subnetFromBits($bits, $networkPrefix)
{
$address = $this->addressFromBits($bits);
$startAddress = $this->addressFromBits($bits);
$numOnes = $this->numBits - $networkPrefix;
if ($numOnes === 0) {
return new Subnet($startAddress, $startAddress, $networkPrefix);
}
$endAddress = $this->addressFromBits(substr($bits, 0, -$numOnes) . str_repeat('1', $numOnes));

return new Subnet($address, $address, $networkPrefix);
return new Subnet($startAddress, $endAddress, $networkPrefix);
}
}
7 changes: 7 additions & 0 deletions test/tests/Ranges/RangesFromBoundariesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public function validProvider()
array('1.2.0.0', '1.2.0.3', array('1.2.0.0/30')),
array('1.2.0.0', '1.2.1.0', array('1.2.0.0/24', '1.2.1.0/32')),
array('128.0.0.0', '127.0.0.0', array('127.0.0.0/8', '128.0.0.0/32')),
array('192.168.0.1', '192.168.0.78', array('192.168.0.1/32', '192.168.0.2/31', '192.168.0.4/30', '192.168.0.8/29', '192.168.0.16/28', '192.168.0.32/27', '192.168.0.64/29', '192.168.0.72/30', '192.168.0.76/31', '192.168.0.78/32')),
array('::1', null, array('::1/128')),
array('::', '::1', array('::/127')),
array('::1', '::1', array('::1/128')),
Expand All @@ -79,6 +80,12 @@ public function testValid($from, $to, array $expected)
$ranges = Factory::rangesFromBoundaries($from, $to);
$this->assertNotNull($ranges, "Boundaries '{$from}' -> '{$to}' should be resolved to an address");
$this->assertSameIPRanges($expected, $ranges);
foreach ($ranges as $range) {
$range2 = Factory::rangeFromString((string) $range);
$this->assertSame((string) $range, (string) $range2, 'Same range');
$this->assertSame((string) $range->getStartAddress(), (string) $range2->getStartAddress(), 'Same start address');
$this->assertSame((string) $range->getEndAddress(), (string) $range2->getEndAddress(), 'Same end address');
}
list($from, $to) = array($to, $from);
$ranges = Factory::rangesFromBoundaries($from, $to);
$this->assertNotNull($ranges, "Boundaries '{$from}' -> '{$to}' should be resolved to an address");
Expand Down

0 comments on commit 3763f50

Please sign in to comment.