fix(config): stop mutating shared config structs during parsing
Prevent data loss and nil panics across 5 parse functions: - chain: nil-guard hop entries to avoid deref on empty YAML lists - hop: build merged metadata map instead of writing inherited values into the original NodeConfig; swap+restore around ParseNode call - node: use local connCfg/dialCfg instead of overwriting cfg.Connector and cfg.Dialer fields; only fill in Type when empty - parser: preserve existing config file fields when env vars override Level/Addr (was replacing the entire struct) - router: only update ipNet from dst CIDR if parse succeeds, keeping the route.Net fallback instead of overwriting with nil
This commit is contained in:
@@ -84,24 +84,28 @@ func (p *parser) Parse() (*config.Config, error) {
|
||||
}
|
||||
|
||||
if v := os.Getenv("GOST_LOGGER_LEVEL"); v != "" {
|
||||
cfg.Log = &config.LogConfig{
|
||||
Level: v,
|
||||
if cfg.Log == nil {
|
||||
cfg.Log = &config.LogConfig{}
|
||||
}
|
||||
cfg.Log.Level = v
|
||||
}
|
||||
if v := os.Getenv("GOST_API"); v != "" {
|
||||
cfg.API = &config.APIConfig{
|
||||
Addr: v,
|
||||
if cfg.API == nil {
|
||||
cfg.API = &config.APIConfig{}
|
||||
}
|
||||
cfg.API.Addr = v
|
||||
}
|
||||
if v := os.Getenv("GOST_METRICS"); v != "" {
|
||||
cfg.Metrics = &config.MetricsConfig{
|
||||
Addr: v,
|
||||
if cfg.Metrics == nil {
|
||||
cfg.Metrics = &config.MetricsConfig{}
|
||||
}
|
||||
cfg.Metrics.Addr = v
|
||||
}
|
||||
if v := os.Getenv("GOST_PROFILING"); v != "" {
|
||||
cfg.Profiling = &config.ProfilingConfig{
|
||||
Addr: v,
|
||||
if cfg.Profiling == nil {
|
||||
cfg.Profiling = &config.ProfilingConfig{}
|
||||
}
|
||||
cfg.Profiling.Addr = v
|
||||
}
|
||||
|
||||
if p.args.Debug || p.args.Trace {
|
||||
|
||||
Reference in New Issue
Block a user