Skip to content

Commit 967ca48

Browse files
committed
fix: Try to fix reload panic
1 parent 57d61b1 commit 967ca48

File tree

1 file changed

+19
-14
lines changed

1 file changed

+19
-14
lines changed

route/router.go

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,32 +45,33 @@ func (r *Router) Initialize(ctx context.Context, logger *log.Logger, options Rou
4545
if r.started {
4646
return errors.New("already initialized")
4747
}
48-
r.ctx = ctx
49-
r.logger = logger
50-
r.outboundMap = options.OutboundMap
51-
r.listMap = options.ListMap
52-
r.ruleRegistry = options.RuleRegistry
53-
r.snifferRegistry = options.SnifferRegistry
54-
r.rules = make([]Rule, 0, len(options.Config.Rules))
48+
rules := make([]Rule, 0, len(options.Config.Rules))
5549
for i, ruleConfig := range options.Config.Rules {
56-
rule, err := NewRule(logger, ruleConfig, r.listMap, r.ruleRegistry)
50+
rule, err := NewRule(logger, ruleConfig, options.ListMap, options.RuleRegistry)
5751
if err != nil {
5852
return fmt.Errorf("initialize rule [index=%d]: %w", i, err)
5953
}
60-
r.rules = append(r.rules, rule)
54+
rules = append(rules, rule)
6155
}
6256
if options.Config.DefaultOutbound != "" {
63-
var err error
64-
r.defaultOutbound, err = r.FindOutboundByName(options.Config.DefaultOutbound)
57+
defaultOutbound, err := r.findOutboundByName(options.OutboundMap, options.Config.DefaultOutbound)
6558
if err != nil {
6659
return common.Cause("default outbound is not found: ", err)
6760
}
61+
r.defaultOutbound = defaultOutbound
6862
} else {
6963
r.defaultOutbound, _ = protocol.NewOutbound(r.logger, &config.Outbound{
7064
Name: "default",
7165
})
72-
r.defaultOutbound.PostInitialize(r)
66+
r.defaultOutbound.PostInitialize(r) // this is dangerous since the router is not fully initialized yet
7367
}
68+
r.ctx = ctx
69+
r.logger = logger
70+
r.outboundMap = options.OutboundMap
71+
r.listMap = options.ListMap
72+
r.ruleRegistry = options.RuleRegistry
73+
r.snifferRegistry = options.SnifferRegistry
74+
r.rules = rules
7475
r.started = true
7576
return nil
7677
}
@@ -169,16 +170,20 @@ func (r *Router) HandleConnection(conn net.Conn, metadata *adapter.Metadata) {
169170
}
170171

171172
func (r *Router) FindOutboundByName(name string) (adapter.Outbound, error) {
173+
return r.findOutboundByName(r.outboundMap, name)
174+
}
175+
176+
func (r *Router) findOutboundByName(outboundMap map[string]adapter.Outbound, name string) (adapter.Outbound, error) {
172177
switch name {
173178
case "REJECT":
174179
return rejectOutbound{}, nil
175180
case "RESET":
176181
return resetOutbound{}, nil
177182
}
178-
if r.outboundMap == nil {
183+
if outboundMap == nil {
179184
return nil, errors.New("outbounds are not initialized")
180185
}
181-
outbound, ok := r.outboundMap[name]
186+
outbound, ok := outboundMap[name]
182187
if !ok {
183188
return nil, fmt.Errorf("outbound not found [%s]", name)
184189
}

0 commit comments

Comments
 (0)