valyala/fasthttp · error

unexpected convert net interface index int to uint32: %w

Error message

unexpected convert net interface index int to uint32: %w

What it means

When parsing a tcp6 address that includes a numeric zone (e.g. "[fe80::1%eth0]:8080" resolved via net.InterfaceByName), getSockaddr must convert the interface index (int) to the uint32 ZoneId field of unix.SockaddrInet6. safeIntToUint32 rejects out-of-range values, and the library wraps that failure with this message.

Source

Thrown at tcplisten/tcplisten.go:162

	switch network {
	case "tcp4":
		var sa4 unix.SockaddrInet4
		sa4.Port = tcpAddr.Port
		copy(sa4.Addr[:], tcpAddr.IP.To4())
		return &sa4, unix.AF_INET, nil
	case "tcp6":
		var sa6 unix.SockaddrInet6
		sa6.Port = tcpAddr.Port
		copy(sa6.Addr[:], tcpAddr.IP.To16())
		if tcpAddr.Zone != "" {
			ifi, err := net.InterfaceByName(tcpAddr.Zone)
			if err != nil {
				return nil, -1, err
			}
			sa6.ZoneId, err = safeIntToUint32(ifi.Index)
			if err != nil {
				return nil, -1, fmt.Errorf("unexpected convert net interface index int to uint32: %w", err)
			}
		}
		return &sa6, unix.AF_INET6, nil
	case "tcp":
		var sa6 unix.SockaddrInet6
		sa6.Port = tcpAddr.Port
		if tcpAddr.IP == nil {
			tcpAddr.IP = net.IPv4(0, 0, 0, 0)
		}
		copy(sa6.Addr[:], tcpAddr.IP.To16())
		if tcpAddr.Zone != "" {
			ifi, err := net.InterfaceByName(tcpAddr.Zone)
			if err != nil {
				return nil, -1, err
			}
			sa6.ZoneId, err = safeIntToUint32(ifi.Index)
			if err != nil {
				return nil, -1, fmt.Errorf("unexpected convert net interface index int to uint32: %w", err)

View on GitHub (pinned to c96f600972)

Solutions

  1. Inspect the wrapped %w error from safeIntToUint32
  2. Verify the interface named in the address Zone exists and has a sane index (ip link show)
  3. Remove the zone from the address if listening on a global-scope address
  4. Update the library/golang.org/x/sys if running an unusual platform

Example fix

// before
ln, err := tcplisten.NewListener(cfg, "tcp6", "[fe80::1%weird0]:8080") // bad zone/index
// after
ifi, _ := net.InterfaceByName("eth0") // validate zone first
ln, err := tcplisten.NewListener(cfg, "tcp6", fmt.Sprintf("[fe80::1%%%s]:8080", ifi.Name))
Defensive patterns

Strategy: validation

Validate before calling

func validV6Zone(addr string) bool {
    host, _, err := net.SplitHostPort(addr)
    if err != nil { return false }
    if i := strings.LastIndexByte(host, '%'); i >= 0 {
        ifi, err := net.InterfaceByName(host[i+1:])
        return err == nil && ifi.Index > 0 && uint64(ifi.Index) <= math.MaxUint32
    }
    return true
}

Try / catch

ln, err := tcplisten.NewListener(cfg, "tcp6", addr)
if err != nil && strings.Contains(err.Error(), "interface index") {
    return fmt.Errorf("bad ipv6 zone in %q: %w", addr, err)
}

Prevention

When it happens

Trigger: NewListener with network "tcp6" (or an address whose zone resolution path reaches this branch) where net.InterfaceByName returns an interface whose Index is negative or exceeds uint32 range — practically only possible with corrupt/mock netstate or an integer overflow scenario.

Common situations: Extremely rare in practice; seen with mocked net.Interface implementations in tests, corrupted /sys/class/net state, or on exotic platforms where interface indexes are not bounded by uint32.

Related errors


AI-assisted analysis of valyala/fasthttp@c96f600972 (2026-08-31). Data as JSON: /api/errors/4b9a392b832bd9f1. Report an issue: GitHub.