{"record":{"id":"8a98dcff37c5e98d","repo":"coredns/coredns","slug":"max-age-can-t-be-negative-s","errorCode":null,"errorMessage":"max_age can't be negative: %s","messagePattern":"max_age can't be negative: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"plugin/forward/setup.go","lineNumber":381,"sourceCode":"\t\t}\n\t\tdur, err := time.ParseDuration(c.Val())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif dur < 0 {\n\t\t\treturn fmt.Errorf(\"expire can't be negative: %s\", dur)\n\t\t}\n\t\tf.expire = dur\n\tcase \"max_age\":\n\t\tif !c.NextArg() {\n\t\t\treturn c.ArgErr()\n\t\t}\n\t\tdur, err := time.ParseDuration(c.Val())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif dur < 0 {\n\t\t\treturn fmt.Errorf(\"max_age can't be negative: %s\", dur)\n\t\t}\n\t\tf.maxAge = dur\n\tcase \"max_idle_conns\":\n\t\tif !c.NextArg() {\n\t\t\treturn c.ArgErr()\n\t\t}\n\t\tn, err := strconv.Atoi(c.Val())\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif n < 0 {\n\t\t\treturn fmt.Errorf(\"max_idle_conns can't be negative: %d\", n)\n\t\t}\n\t\tf.maxIdleConns = n\n\tcase \"read_timeout\":\n\t\tif !c.NextArg() {\n\t\t\treturn c.ArgErr()\n\t\t}","sourceCodeStart":363,"sourceCodeEnd":399,"githubUrl":"https://github.com/coredns/coredns/blob/558c9757a92b361e550bdba82d0b4ddf3d12d595/plugin/forward/setup.go#L363-L399","documentation":"The forward plugin's `max_age` option caps how long a connection may be reused. parseBlock parses it as a duration and rejects negative values because a maximum age cannot be negative. CoreDNS startup aborts with this message including the invalid value.","triggerScenarios":"A Corefile line like `max_age -30s` inside a forward block, or a generated/templated value that expanded to a negative duration.","commonSituations":"Typos adding a minus sign; scripts computing age offsets and passing a negative delta; confusing max_age (non-negative) with values that must be strictly positive like read_timeout.","solutions":["Set a non-negative duration, e.g. `max_age 2m`.","Remove the minus sign or fix the generating script's computation.","Clamp computed values: if d < 0 { d = 0 } before writing the Corefile."],"exampleFix":"// before\nforward . 8.8.8.8 {\n    max_age -2m\n}\n// after\nforward . 8.8.8.8 {\n    max_age 2m\n}","handlingStrategy":"validation","validationCode":"d, err := time.ParseDuration(maxAgeStr)\nif err != nil || d < 0 {\n    return fmt.Errorf(\"max_age must be a non-negative duration, got %q\", maxAgeStr)\n}","typeGuard":null,"tryCatchPattern":"if err := coredns.CheckConfig(corefile); err != nil { log.Fatalf(\"invalid max_age: %v\", err) }","preventionTips":["Validate max_age is >= 0 in config generators","Avoid computing max_age from signed deltas that can go negative","Lint Corefiles before deployment"],"tags":["coredns","config","duration","validation"],"backgroundTag":"value-out-of-range","analyzedSha":"558c9757a92b361e550bdba82d0b4ddf3d12d595","analyzedAt":"2026-09-06T22:47:02.106Z","contentChangedAt":"2026-09-06T22:47:02.106Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}