hashicorp/terraform · error
Invalid TCP address for
Error message
Invalid TCP address %q for %q: %w
What it means
Thrown while resolving a reattach address whose Network is 'tcp'. net.ResolveTCPAddr failed to parse the configured String field as a TCP endpoint.
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
Example fix
// before: addr.String = "tcp://127.0.0.1:5678" // after : addr.String = "127.0.0.1:5678"
Defensive patterns
Strategy: validation
Validate before calling
// Pre-validate a host:port pair for TCP reattach.
func validTCPAddr(s string) bool {
host, port, err := net.SplitHostPort(s)
return err == nil && host != "" && port != "" && !strings.Contains(s, "://")
} Type guard
func IsValidTCPAddr(s string) bool {
_, _, err := net.SplitHostPort(s)
return err == nil && !strings.HasPrefix(s, "tcp://")
} Try / catch
providers, err := reattach.DecodeProviders(raw)
if err != nil && strings.Contains(err.Error(), "TCP address") {
return fmt.Errorf("reattach TCP address must be 'host:port' (no scheme): %w", err)
} Prevention
- 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
When it happens
Trigger: c.Addr.Network == "tcp" and net.ResolveTCPAddr("tcp", c.Addr.String) returned a non-nil error.
Common situations: 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'.
Related errors
- Invalid unix socket path
- Unknown address type
- Error parsing as a provider address
- Invalid format for
- can't set both encryption_key and kms_encryption_key
AI-assisted analysis of hashicorp/terraform@d32a084675 (2026-08-11).
Data as JSON: /api/errors/dba0c721d229620f.
Report an issue: GitHub.
Appendix: source
Thrown at internal/getproviders/reattach/reattach.go:71
if err != nil {
return unmanagedProviders, fmt.Errorf("Invalid format for %s: %w", TF_REATTACH_PROVIDERS, err)
}
for p, c := range m {
a, diags := addrs.ParseProviderSourceString(p)
if diags.HasErrors() {
return unmanagedProviders, fmt.Errorf("Error parsing %q as a provider address: %w", a, diags.Err())
}
var addr net.Addr
switch c.Addr.Network {
case "unix":
addr, err = net.ResolveUnixAddr("unix", c.Addr.String)
if err != nil {
return unmanagedProviders, fmt.Errorf("Invalid unix socket path %q for %q: %w", c.Addr.String, p, err)
}
case "tcp":
addr, err = net.ResolveTCPAddr("tcp", c.Addr.String)
if err != nil {
return unmanagedProviders, fmt.Errorf("Invalid TCP address %q for %q: %w", c.Addr.String, p, err)
}
default:
return unmanagedProviders, fmt.Errorf("Unknown address type %q for %q", c.Addr.Network, p)
}
unmanagedProviders[a] = &plugin.ReattachConfig{
Protocol: plugin.Protocol(c.Protocol),
ProtocolVersion: c.ProtocolVersion,
Pid: c.Pid,
Test: c.Test,
Addr: addr,
}
}
}
return unmanagedProviders, nil
}
// IsProviderReattached determines if a given provider is being supplied to Terraform via the TF_REATTACH_PROVIDERS
// environment variable.View on GitHub (pinned to d32a084675)