diff --git a/newt/syscfg/syscfg.go b/newt/syscfg/syscfg.go index 886699cca..3efa42490 100644 --- a/newt/syscfg/syscfg.go +++ b/newt/syscfg/syscfg.go @@ -209,20 +209,33 @@ func ResolveValueRefName(val string) string { } func (cfg *Cfg) ExpandRef(val string) (string, string, error) { + var visited []string + var entry CfgEntry + var ok bool + refName := ResolveValueRefName(val) if refName == "" { // Not a reference. return "", val, nil } - entry, ok := cfg.Settings[refName] - if !ok { - return "", "", util.FmtNewtError( - "setting value \"%s\" references undefined setting", val) + for refName != "" { + entry, ok = cfg.Settings[refName] + if !ok { + return "", "", util.FmtNewtError( + "setting value \"%s\" references undefined setting", val) + } + for _, v := range visited { + if entry.Name == v { + return "", "", util.FmtNewtError( + "setting value \"%s\" creates a reference loop", entry.Name) + } + } + visited = append(visited, entry.Name) + refName = ResolveValueRefName(entry.Value) } return entry.Name, entry.Value, nil - } func (cfg *Cfg) AddInjectedSettings() { diff --git a/newt/val/valsetting.go b/newt/val/valsetting.go index 0d24218a7..78c3e54e1 100644 --- a/newt/val/valsetting.go +++ b/newt/val/valsetting.go @@ -57,8 +57,7 @@ func (vs *ValSetting) IntVal() (int, error) { func ResolveValSetting(s string, cfg *syscfg.Cfg) (ValSetting, error) { refName, val, err := cfg.ExpandRef(s) if err != nil { - return ValSetting{}, - util.FmtNewtError("value \"%s\" references undefined setting", s) + return ValSetting{}, err } return ValSetting{