Skip to content

Commit ba5dd36

Browse files
committed
update
1 parent 1b1ca88 commit ba5dd36

File tree

1 file changed

+33
-28
lines changed

1 file changed

+33
-28
lines changed

reader.go

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package ipdb
22

33
import (
4-
"os"
54
"encoding/binary"
6-
"errors"
75
"encoding/json"
6+
"errors"
87
"io/ioutil"
98
"net"
10-
"strings"
9+
"os"
1110
"reflect"
12-
"unsafe"
11+
"strings"
1312
"time"
13+
"unsafe"
1414
)
1515

1616
const IPv4 = 0x01
@@ -26,25 +26,25 @@ var (
2626
ErrIPFormat = errors.New("Query IP Format error.")
2727

2828
ErrNoSupportLanguage = errors.New("language not support")
29-
ErrNoSupportIPv4 = errors.New("IPv4 not support")
30-
ErrNoSupportIPv6 = errors.New("IPv6 not support")
29+
ErrNoSupportIPv4 = errors.New("IPv4 not support")
30+
ErrNoSupportIPv6 = errors.New("IPv6 not support")
3131

3232
ErrDataNotExists = errors.New("data is not exists")
3333
)
3434

3535
type MetaData struct {
36-
Build int64 `json:"build"`
37-
IPVersion uint16 `json:"ip_version"`
38-
Languages map[string]int `json:"languages"`
39-
NodeCount int `json:"node_count"`
40-
TotalSize int `json:"total_size"`
41-
Fields []string `json:"fields"`
36+
Build int64 `json:"build"`
37+
IPVersion uint16 `json:"ip_version"`
38+
Languages map[string]int `json:"languages"`
39+
NodeCount int `json:"node_count"`
40+
TotalSize int `json:"total_size"`
41+
Fields []string `json:"fields"`
4242
}
4343

4444
type reader struct {
45-
fileSize int
45+
fileSize int
4646
nodeCount int
47-
v4offset int
47+
v4offset int
4848

4949
meta MetaData
5050
data []byte
@@ -60,20 +60,25 @@ func newReader(name string, obj interface{}) (*reader, error) {
6060
return nil, err
6161
}
6262
fileSize := int(fileInfo.Size())
63-
63+
if fileSize < 4 {
64+
return nil, ErrFileSize
65+
}
6466
body, err := ioutil.ReadFile(name)
6567
if err != nil {
6668
return nil, ErrReadFull
6769
}
6870
var meta MetaData
6971
metaLength := int(binary.BigEndian.Uint32(body[0:4]))
72+
if fileSize < (4 + metaLength) {
73+
return nil, ErrFileSize
74+
}
7075
if err := json.Unmarshal(body[4:4+metaLength], &meta); err != nil {
7176
return nil, err
7277
}
7378
if len(meta.Languages) == 0 || len(meta.Fields) == 0 {
7479
return nil, ErrMetaData
7580
}
76-
if fileSize != (4+metaLength+meta.TotalSize) {
81+
if fileSize != (4 + metaLength + meta.TotalSize) {
7782
return nil, ErrFileSize
7883
}
7984

@@ -88,10 +93,10 @@ func newReader(name string, obj interface{}) (*reader, error) {
8893
}
8994

9095
db := &reader{
91-
fileSize: fileSize,
96+
fileSize: fileSize,
9297
nodeCount: meta.NodeCount,
9398

94-
meta:meta,
99+
meta: meta,
95100
refType: dm,
96101

97102
data: body[4+metaLength:],
@@ -182,7 +187,7 @@ func (db *reader) find1(addr, language string) ([]string, error) {
182187
return nil, ErrDatabaseError
183188
}
184189

185-
return tmp[off:off+len(db.meta.Fields)], nil
190+
return tmp[off : off+len(db.meta.Fields)], nil
186191
}
187192

188193
func (db *reader) search(ip net.IP, bitCount int) (int, error) {
@@ -192,15 +197,15 @@ func (db *reader) search(ip net.IP, bitCount int) (int, error) {
192197
if bitCount == 32 {
193198
node = db.v4offset
194199
} else {
195-
node = 0;
200+
node = 0
196201
}
197202

198203
for i := 0; i < bitCount; i++ {
199204
if node > db.nodeCount {
200205
break
201206
}
202207

203-
node = db.readNode(node, ((0xFF & int(ip[i >> 3])) >> uint(7 - (i % 8))) & 1)
208+
node = db.readNode(node, ((0xFF&int(ip[i>>3]))>>uint(7-(i%8)))&1)
204209
}
205210

206211
if node > db.nodeCount {
@@ -211,21 +216,21 @@ func (db *reader) search(ip net.IP, bitCount int) (int, error) {
211216
}
212217

213218
func (db *reader) readNode(node, index int) int {
214-
off := node * 8 + index * 4
215-
return int(binary.BigEndian.Uint32(db.data[off:off+4]))
219+
off := node*8 + index*4
220+
return int(binary.BigEndian.Uint32(db.data[off : off+4]))
216221
}
217222

218223
func (db *reader) resolve(node int) ([]byte, error) {
219-
resolved := node - db.nodeCount + db.nodeCount * 8
224+
resolved := node - db.nodeCount + db.nodeCount*8
220225
if resolved >= db.fileSize {
221226
return nil, ErrDatabaseError
222227
}
223228

224-
size := int(binary.BigEndian.Uint16(db.data[resolved:resolved+2]))
225-
if (resolved+2+size) > len(db.data) {
229+
size := int(binary.BigEndian.Uint16(db.data[resolved : resolved+2]))
230+
if (resolved + 2 + size) > len(db.data) {
226231
return nil, ErrDatabaseError
227232
}
228-
bytes := db.data[resolved+2:resolved+2+size]
233+
bytes := db.data[resolved+2 : resolved+2+size]
229234

230235
return bytes, nil
231236
}
@@ -248,4 +253,4 @@ func (db *reader) Languages() []string {
248253
ls = append(ls, k)
249254
}
250255
return ls
251-
}
256+
}

0 commit comments

Comments
 (0)