Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit e43ff23

Browse files
committed
fix #3 bad indexing
1 parent 73cd2ef commit e43ff23

File tree

1 file changed

+20
-11
lines changed

1 file changed

+20
-11
lines changed

src/Iptool.php

+20-11
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ public function __construct($databaseFile)
8484
'dit' => $dit,
8585
'version' => $tmp['ver'],
8686
];
87+
if ($this->meta['version'] !== self::VERSION) {
88+
fclose($this->db);
89+
$this->errors[] = 'file '.$databaseFile.' is not database version '.self::VERSION;
90+
return;
91+
}
8792
$registersCount = $tmp['count'];
8893
$registersFormatLen = $tmp['formatLen'];
8994
$tmp = unpack('A*format',substr($header,$offset,$registersFormatLen));
@@ -136,13 +141,16 @@ public function find($ip)
136141
$data = array();
137142
$octet = (int)$ip;
138143
$long = pack('N',ip2long($ip));
139-
$start = $stop = $this->meta['index'][$octet];
144+
$start = $this->meta['index'][$octet];
145+
$stop = $this->meta['index'][$octet];
140146
while($octet < 255 && $this->meta['index'][$octet] == $start) {
141-
$stop = $this->meta['index'][$octet];
142147
$octet++;
148+
$stop = $this->meta['index'][$octet];
143149
}
144150
if ($stop == $start) {
145151
$stop = $this->meta['networks']['items'];
152+
} elseif ($stop < $this->meta['networks']['items']) {
153+
$stop++;
146154
}
147155
if ($start > 0) {
148156
$start--;
@@ -151,23 +159,24 @@ public function find($ip)
151159
$seek = $this->meta['networks']['offset']+($start*$this->meta['networks']['len']);
152160
fseek($this->db,$seek);
153161
$blocks = fread($this->db,$blockCount*$this->meta['networks']['len']);
162+
$blocksLength = strlen($blocks);
154163
$offset = 0;
155-
$step = ceil(sqrt($blockCount));
156-
157-
$check = substr($blocks, $offset + ($this->meta['networks']['len'] * $step), 4);
158-
while ($check && $long >= $check && ($offset < ($blockCount)*$this->meta['networks']['len'])) {
159-
$offset += $this->meta['networks']['len'] * $step;
164+
if ($blockCount > 10) {
165+
$step = ceil(sqrt($blockCount));
160166
$check = substr($blocks, $offset + ($this->meta['networks']['len'] * $step), 4);
167+
while ($check && $long >= $check && ($offset < ($blockCount) * $this->meta['networks']['len'])) {
168+
$offset += $this->meta['networks']['len'] * $step;
169+
$check = substr($blocks, $offset + ($this->meta['networks']['len'] * $step), 4);
170+
}
161171
}
162-
163172
do {
164-
if ($offset > strlen($blocks)) {
165-
$offset = strlen($blocks)-$this->meta['networks']['len'];
173+
if ($offset > $blocksLength) {
174+
$offset = $blocksLength-$this->meta['networks']['len'];
166175
}
167176
$block = substr($blocks,$offset,$this->meta['networks']['len']);
168177
$first = substr($block,0,4);
169178
$next = substr($blocks,$offset+$this->meta['networks']['len'],4);
170-
if ($first <= $long && ($long < $next || $next === false)) {
179+
if ($first <= $long && ($long < $next || $next == false)) {
171180
$registers = unpack($this->meta['networks']['pack'],substr($block,4));
172181
}
173182
$offset += $this->meta['networks']['len'];

0 commit comments

Comments
 (0)