Merge pull request #130 from apernet/fix-geo-leak

fix: do not reload geoip/geosite when reloading ruleset to prevent leaking references to streams
This commit is contained in:
Toby 2024-04-10 22:57:18 -07:00 committed by GitHub
commit 245ac46b65
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 10 additions and 12 deletions

View File

@ -17,6 +17,7 @@ import (
"github.com/apernet/OpenGFW/modifier" "github.com/apernet/OpenGFW/modifier"
modUDP "github.com/apernet/OpenGFW/modifier/udp" modUDP "github.com/apernet/OpenGFW/modifier/udp"
"github.com/apernet/OpenGFW/ruleset" "github.com/apernet/OpenGFW/ruleset"
"github.com/apernet/OpenGFW/ruleset/builtins/geo"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/viper" "github.com/spf13/viper"
@ -259,8 +260,7 @@ func runMain(cmd *cobra.Command, args []string) {
} }
rsConfig := &ruleset.BuiltinConfig{ rsConfig := &ruleset.BuiltinConfig{
Logger: &rulesetLogger{}, Logger: &rulesetLogger{},
GeoSiteFilename: config.Ruleset.GeoSite, GeoMatcher: geo.NewGeoMatcher(config.Ruleset.GeoSite, config.Ruleset.GeoIp),
GeoIpFilename: config.Ruleset.GeoIp,
ProtectedDialContext: engineConfig.IO.ProtectedDialContext, ProtectedDialContext: engineConfig.IO.ProtectedDialContext,
} }
rs, err := ruleset.CompileExprRules(rawRs, analyzers, modifiers, rsConfig) rs, err := ruleset.CompileExprRules(rawRs, analyzers, modifiers, rsConfig)

View File

@ -20,7 +20,6 @@ import (
"github.com/apernet/OpenGFW/analyzer" "github.com/apernet/OpenGFW/analyzer"
"github.com/apernet/OpenGFW/modifier" "github.com/apernet/OpenGFW/modifier"
"github.com/apernet/OpenGFW/ruleset/builtins" "github.com/apernet/OpenGFW/ruleset/builtins"
"github.com/apernet/OpenGFW/ruleset/builtins/geo"
) )
// ExprRule is the external representation of an expression rule. // ExprRule is the external representation of an expression rule.
@ -302,23 +301,22 @@ type Function struct {
} }
func buildFunctionMap(config *BuiltinConfig) map[string]*Function { func buildFunctionMap(config *BuiltinConfig) map[string]*Function {
geoMatcher := geo.NewGeoMatcher(config.GeoSiteFilename, config.GeoIpFilename)
return map[string]*Function{ return map[string]*Function{
"geoip": { "geoip": {
InitFunc: geoMatcher.LoadGeoIP, InitFunc: config.GeoMatcher.LoadGeoIP,
PatchFunc: nil, PatchFunc: nil,
Func: func(params ...any) (any, error) { Func: func(params ...any) (any, error) {
return geoMatcher.MatchGeoIp(params[0].(string), params[1].(string)), nil return config.GeoMatcher.MatchGeoIp(params[0].(string), params[1].(string)), nil
}, },
Types: []reflect.Type{reflect.TypeOf(geoMatcher.MatchGeoIp)}, Types: []reflect.Type{reflect.TypeOf(config.GeoMatcher.MatchGeoIp)},
}, },
"geosite": { "geosite": {
InitFunc: geoMatcher.LoadGeoSite, InitFunc: config.GeoMatcher.LoadGeoSite,
PatchFunc: nil, PatchFunc: nil,
Func: func(params ...any) (any, error) { Func: func(params ...any) (any, error) {
return geoMatcher.MatchGeoSite(params[0].(string), params[1].(string)), nil return config.GeoMatcher.MatchGeoSite(params[0].(string), params[1].(string)), nil
}, },
Types: []reflect.Type{reflect.TypeOf(geoMatcher.MatchGeoSite)}, Types: []reflect.Type{reflect.TypeOf(config.GeoMatcher.MatchGeoSite)},
}, },
"cidr": { "cidr": {
InitFunc: nil, InitFunc: nil,

View File

@ -7,6 +7,7 @@ import (
"github.com/apernet/OpenGFW/analyzer" "github.com/apernet/OpenGFW/analyzer"
"github.com/apernet/OpenGFW/modifier" "github.com/apernet/OpenGFW/modifier"
"github.com/apernet/OpenGFW/ruleset/builtins/geo"
) )
type Action int type Action int
@ -102,7 +103,6 @@ type Logger interface {
type BuiltinConfig struct { type BuiltinConfig struct {
Logger Logger Logger Logger
GeoSiteFilename string GeoMatcher *geo.GeoMatcher
GeoIpFilename string
ProtectedDialContext func(ctx context.Context, network, address string) (net.Conn, error) ProtectedDialContext func(ctx context.Context, network, address string) (net.Conn, error)
} }