Skip to content

Commit d8554e5

Browse files
committed
Properly filter to only return IPv4 addresses for type A queries
1 parent 61b603c commit d8554e5

3 files changed

Lines changed: 21 additions & 4 deletions

File tree

src/Query/HostsFileExecutor.php

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,15 @@ public function __construct(HostsFile $hosts, ExecutorInterface $fallback)
2828
public function query($nameserver, Query $query)
2929
{
3030
if ($query->class === Message::CLASS_IN && $query->type === Message::TYPE_A) {
31-
$ips = $this->hosts->getIpsForHost($query->name);
32-
if ($ips) {
33-
$records = array();
34-
foreach ($ips as $ip) {
31+
$records = array();
32+
foreach ($this->hosts->getIpsForHost($query->name) as $ip) {
33+
// ensure this is an IPv4 address
34+
if (strpos($ip, ':') === false) {
3535
$records[] = new Record($query->name, $query->type, $query->class, 0, $ip);
3636
}
37+
}
3738

39+
if ($records) {
3840
return Promise\resolve(
3941
Message::createResponseWithAnswersForQuery($query, $records)
4042
);

tests/Config/HostsFileTest.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,11 @@ public function testMergesEntriesOverMultipleLines()
7777

7878
$this->assertEquals(array('127.0.0.1', '127.0.0.2', '127.0.0.3', '127.0.0.4'), $hosts->getIpsForHost('localhost'));
7979
}
80+
81+
public function testMergesIpv4AndIpv6EntriesOverMultipleLines()
82+
{
83+
$hosts = new HostsFile("127.0.0.1 localhost\n::1 localhost");
84+
85+
$this->assertEquals(array('127.0.0.1', '::1'), $hosts->getIpsForHost('localhost'));
86+
}
8087
}

tests/Query/HostsFileExecutorTest.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,12 @@ public function testReturnsResponseMessageIfIpsWereFound()
4343

4444
$ret = $this->executor->query('8.8.8.8', new Query('google.com', Message::TYPE_A, Message::CLASS_IN, 0));
4545
}
46+
47+
public function testFallsBackIfNoIpv4Matches()
48+
{
49+
$this->hosts->expects($this->once())->method('getIpsForHost')->willReturn(array('::1'));
50+
$this->fallback->expects($this->once())->method('query');
51+
52+
$ret = $this->executor->query('8.8.8.8', new Query('google.com', Message::TYPE_A, Message::CLASS_IN, 0));
53+
}
4654
}

0 commit comments

Comments
 (0)