From fe3426b4c72aa32e5cc5f1a3cdc7c346ce585940 Mon Sep 17 00:00:00 2001 From: Joe Tsai Date: Tue, 5 Jul 2022 18:27:31 -0700 Subject: [PATCH] logpolicy: fix config initialization bug (#5010) If ConfigFromFile cannot find the configuration file, we must not initialize it with NewConfig. Instead, we need it to fail validation so that it eventually writes a newly constructed configuration file. Otherwise, new tailscale instances will never be able store a persistent log config and start with a new config file upon every bootup. Signed-off-by: Joe Tsai --- logpolicy/logpolicy.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/logpolicy/logpolicy.go b/logpolicy/logpolicy.go index 558a9d642..952c3dc79 100644 --- a/logpolicy/logpolicy.go +++ b/logpolicy/logpolicy.go @@ -112,6 +112,8 @@ func NewConfig(collection string) *Config { // and that the PrivateID and PublicID pair are sensible. func (c *Config) Validate(collection string) error { switch { + case c == nil: + return errors.New("config is nil") case c.Collection != collection: return fmt.Errorf("config collection %q does not match %q", c.Collection, collection) case c.PrivateID.IsZero(): @@ -509,11 +511,10 @@ func New(collection string) *Policy { newc, err := ConfigFromFile(cfgPath) if err != nil { earlyLogf("logpolicy.ConfigFromFile %v: %v", cfgPath, err) - newc = NewConfig(collection) } if err := newc.Validate(collection); err != nil { - earlyLogf("logpolicy.Config.Validate for %q: %v", cfgPath, err) - newc := NewConfig(collection) + earlyLogf("logpolicy.Config.Validate for %v: %v", cfgPath, err) + newc = NewConfig(collection) if err := newc.Save(cfgPath); err != nil { earlyLogf("logpolicy.Config.Save for %v: %v", cfgPath, err) }