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

  1. Use a bare 'host:port' value (e.g. '127.0.0.1:5678') without a scheme
  2. Ensure the port is numeric and in range 1-65535
  3. 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

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


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)