Skip to content

Commit aee3a20

Browse files
ClaudeLoyalsoldier
andauthored
Fix: several latent bugs in entry caching, private input and output writers
Agent-Logs-Url: https://github.com/Loyalsoldier/geoip/sessions/051395fa-8215-474c-b4a5-423d84a33e0c Co-authored-by: Loyalsoldier <10487845+Loyalsoldier@users.noreply.github.com>
1 parent e25248c commit aee3a20

6 files changed

Lines changed: 47 additions & 5 deletions

File tree

lib/container.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,13 @@ func (c *container) Add(entry *Entry, opts ...IgnoreIPOption) error {
9393
val.ipv6Builder = new(netipx.IPSetBuilder)
9494
}
9595
val.ipv6Builder.AddSet(ipv6set)
96+
val.resetIPv6Set()
9697
case IPv6:
9798
if !val.hasIPv4Builder() {
9899
val.ipv4Builder = new(netipx.IPSetBuilder)
99100
}
100101
val.ipv4Builder.AddSet(ipv4set)
102+
val.resetIPv4Set()
101103
default:
102104
if !val.hasIPv4Builder() {
103105
val.ipv4Builder = new(netipx.IPSetBuilder)
@@ -107,14 +109,18 @@ func (c *container) Add(entry *Entry, opts ...IgnoreIPOption) error {
107109
}
108110
val.ipv4Builder.AddSet(ipv4set)
109111
val.ipv6Builder.AddSet(ipv6set)
112+
val.resetIPv4Set()
113+
val.resetIPv6Set()
110114
}
111115

112116
case false:
113117
switch ignoreIPType {
114118
case IPv4:
115119
entry.ipv4Builder = nil
120+
entry.resetIPv4Set()
116121
case IPv6:
117122
entry.ipv6Builder = nil
123+
entry.resetIPv6Set()
118124
}
119125
c.entries[name] = entry
120126
}
@@ -159,11 +165,13 @@ func (c *container) Remove(entry *Entry, rCase CaseRemove, opts ...IgnoreIPOptio
159165
val.ipv6Builder = new(netipx.IPSetBuilder)
160166
}
161167
val.ipv6Builder.RemoveSet(ipv6set)
168+
val.resetIPv6Set()
162169
case IPv6:
163170
if !val.hasIPv4Builder() {
164171
val.ipv4Builder = new(netipx.IPSetBuilder)
165172
}
166173
val.ipv4Builder.RemoveSet(ipv4set)
174+
val.resetIPv4Set()
167175
default:
168176
if !val.hasIPv4Builder() {
169177
val.ipv4Builder = new(netipx.IPSetBuilder)
@@ -173,14 +181,18 @@ func (c *container) Remove(entry *Entry, rCase CaseRemove, opts ...IgnoreIPOptio
173181
}
174182
val.ipv4Builder.RemoveSet(ipv4set)
175183
val.ipv6Builder.RemoveSet(ipv6set)
184+
val.resetIPv4Set()
185+
val.resetIPv6Set()
176186
}
177187

178188
case CaseRemoveEntry:
179189
switch ignoreIPType {
180190
case IPv4:
181191
val.ipv6Builder = nil
192+
val.resetIPv6Set()
182193
case IPv6:
183194
val.ipv4Builder = nil
195+
val.resetIPv4Set()
184196
default:
185197
delete(c.entries, name)
186198
}

lib/entry.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@ func (e *Entry) hasIPv6Set() bool {
4343
return e.ipv6Set != nil
4444
}
4545

46+
// resetIPv4Set discards the cached IPv4 set, so that it will be rebuilt
47+
// from the builder on the next use.
48+
func (e *Entry) resetIPv4Set() {
49+
e.ipv4Set = nil
50+
}
51+
52+
// resetIPv6Set discards the cached IPv6 set, so that it will be rebuilt
53+
// from the builder on the next use.
54+
func (e *Entry) resetIPv6Set() {
55+
e.ipv6Set = nil
56+
}
57+
4658
func (e *Entry) GetIPv4Set() (*netipx.IPSet, error) {
4759
if err := e.buildIPSet(); err != nil {
4860
return nil, err
@@ -253,11 +265,13 @@ func (e *Entry) add(prefix *netip.Prefix, ipType IPType) error {
253265
e.ipv4Builder = new(netipx.IPSetBuilder)
254266
}
255267
e.ipv4Builder.AddPrefix(*prefix)
268+
e.resetIPv4Set()
256269
case IPv6:
257270
if !e.hasIPv6Builder() {
258271
e.ipv6Builder = new(netipx.IPSetBuilder)
259272
}
260273
e.ipv6Builder.AddPrefix(*prefix)
274+
e.resetIPv6Set()
261275
default:
262276
return ErrInvalidIPType
263277
}
@@ -270,10 +284,12 @@ func (e *Entry) remove(prefix *netip.Prefix, ipType IPType) error {
270284
case IPv4:
271285
if e.hasIPv4Builder() {
272286
e.ipv4Builder.RemovePrefix(*prefix)
287+
e.resetIPv4Set()
273288
}
274289
case IPv6:
275290
if e.hasIPv6Builder() {
276291
e.ipv6Builder.RemovePrefix(*prefix)
292+
e.resetIPv6Set()
277293
}
278294
default:
279295
return ErrInvalidIPType

plugin/maxmind/maxmind_country_csv_in.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,10 @@ func (g *GeoLite2CountryCSVIn) getCountryCode() (map[string]string, error) {
167167
}
168168

169169
ccMap := make(map[string]string)
170+
if len(lines) == 0 {
171+
return nil, fmt.Errorf("❌ [type %s | action %s] empty country code file: %s", g.Type, g.Action, g.CountryCodeFile)
172+
}
173+
170174
for _, line := range lines[1:] {
171175
if len(line) < 5 {
172176
return nil, fmt.Errorf("❌ [type %s | action %s] invalid record: %v", g.Type, g.Action, line)

plugin/mihomo/mrs_out.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,18 @@ func (m *MRSOut) writeFile(filename string, ipRanges []netipx.IPRange) error {
164164
if err != nil {
165165
return err
166166
}
167+
167168
defer f.Close()
168169

169170
err = m.convertToMrs(ipRanges, f)
170171
if err != nil {
171172
return err
172173
}
173174

175+
if err := f.Close(); err != nil {
176+
return err
177+
}
178+
174179
log.Printf("✅ [%s] %s --> %s", m.Type, filename, m.OutputDir)
175180

176181
return nil
@@ -181,7 +186,11 @@ func (m *MRSOut) convertToMrs(ipRanges []netipx.IPRange, w io.Writer) (err error
181186
if err != nil {
182187
return err
183188
}
184-
defer encoder.Close()
189+
defer func() {
190+
if closeErr := encoder.Close(); closeErr != nil && err == nil {
191+
err = closeErr
192+
}
193+
}()
185194

186195
// header
187196
_, err = encoder.Write(mrsMagicBytes[:])

plugin/singbox/srs_out.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,10 @@ func (s *SRSOut) writeFile(filename string, ruleset *option.PlainRuleSet) error
190190
return err
191191
}
192192

193+
if err := f.Close(); err != nil {
194+
return err
195+
}
196+
193197
log.Printf("✅ [%s] %s --> %s", s.Type, filename, s.OutputDir)
194198

195199
return nil

plugin/special/private.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,7 @@ func (p *Private) GetDescription() string {
8484
}
8585

8686
func (p *Private) Input(container lib.Container) (lib.Container, error) {
87-
entry, found := container.GetEntry(entryNamePrivate)
88-
if !found {
89-
entry = lib.NewEntry(entryNamePrivate)
90-
}
87+
entry := lib.NewEntry(entryNamePrivate)
9188

9289
for _, cidr := range privateCIDRs {
9390
if err := entry.AddPrefix(cidr); err != nil {

0 commit comments

Comments
 (0)