{"record":{"id":"dba0c721d229620f","repo":"hashicorp/terraform","slug":"invalid-tcp-address-q-for-q-w","errorCode":null,"errorMessage":"Invalid TCP address %q for %q: %w","messagePattern":"Invalid TCP address %q for %q: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/getproviders/reattach/reattach.go","lineNumber":71,"sourceCode":"\t\tif err != nil {\n\t\t\treturn unmanagedProviders, fmt.Errorf(\"Invalid format for %s: %w\", TF_REATTACH_PROVIDERS, err)\n\t\t}\n\t\tfor p, c := range m {\n\t\t\ta, diags := addrs.ParseProviderSourceString(p)\n\t\t\tif diags.HasErrors() {\n\t\t\t\treturn unmanagedProviders, fmt.Errorf(\"Error parsing %q as a provider address: %w\", a, diags.Err())\n\t\t\t}\n\t\t\tvar addr net.Addr\n\t\t\tswitch c.Addr.Network {\n\t\t\tcase \"unix\":\n\t\t\t\taddr, err = net.ResolveUnixAddr(\"unix\", c.Addr.String)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn unmanagedProviders, fmt.Errorf(\"Invalid unix socket path %q for %q: %w\", c.Addr.String, p, err)\n\t\t\t\t}\n\t\t\tcase \"tcp\":\n\t\t\t\taddr, err = net.ResolveTCPAddr(\"tcp\", c.Addr.String)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn unmanagedProviders, fmt.Errorf(\"Invalid TCP address %q for %q: %w\", c.Addr.String, p, err)\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn unmanagedProviders, fmt.Errorf(\"Unknown address type %q for %q\", c.Addr.Network, p)\n\t\t\t}\n\t\t\tunmanagedProviders[a] = &plugin.ReattachConfig{\n\t\t\t\tProtocol:        plugin.Protocol(c.Protocol),\n\t\t\t\tProtocolVersion: c.ProtocolVersion,\n\t\t\t\tPid:             c.Pid,\n\t\t\t\tTest:            c.Test,\n\t\t\t\tAddr:            addr,\n\t\t\t}\n\t\t}\n\t}\n\treturn unmanagedProviders, nil\n}\n\n// IsProviderReattached determines if a given provider is being supplied to Terraform via the TF_REATTACH_PROVIDERS\n// environment variable.","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/hashicorp/terraform/blob/d32a084675427f5ac3f7d2868578ef8b2c1dc525/internal/getproviders/reattach/reattach.go#L53-L89","documentation":"Thrown while resolving a reattach address whose Network is 'tcp'. net.ResolveTCPAddr failed to parse the configured String field as a TCP endpoint.","triggerScenarios":"c.Addr.Network == \"tcp\" and net.ResolveTCPAddr(\"tcp\", c.Addr.String) returned a non-nil error.","commonSituations":"Malformed host:port (missing port, non-numeric port, double colon); empty String; port out of range; address with a scheme prefix like 'tcp://127.0.0.1:9999' instead of bare '127.0.0.1:9999'.","solutions":["Use a bare 'host:port' value (e.g. '127.0.0.1:5678') without a scheme","Ensure the port is numeric and in range 1-65535","Remove any leading 'tcp://' from the address string"],"exampleFix":"// before: addr.String = \"tcp://127.0.0.1:5678\"\n// after : addr.String = \"127.0.0.1:5678\"","handlingStrategy":"validation","validationCode":"// Pre-validate a host:port pair for TCP reattach.\nfunc validTCPAddr(s string) bool {\n    host, port, err := net.SplitHostPort(s)\n    return err == nil && host != \"\" && port != \"\" && !strings.Contains(s, \"://\")\n}","typeGuard":"func IsValidTCPAddr(s string) bool {\n    _, _, err := net.SplitHostPort(s)\n    return err == nil && !strings.HasPrefix(s, \"tcp://\")\n}","tryCatchPattern":"providers, err := reattach.DecodeProviders(raw)\nif err != nil && strings.Contains(err.Error(), \"TCP address\") {\n    return fmt.Errorf(\"reattach TCP address must be 'host:port' (no scheme): %w\", err)\n}","preventionTips":["Use bare 'host:port' without a 'tcp://' scheme prefix","Ensure the port is numeric and in range 1-65535","Prefer SplitHostPort to confirm shape before exporting the env var"],"tags":["reattach","tcp","network","config","validation"],"backgroundTag":null,"analyzedSha":"d32a084675427f5ac3f7d2868578ef8b2c1dc525","analyzedAt":"2026-08-11T18:43:52.779Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}