tsenart/vegeta · error

must specify at least resolver address

Error message

must specify at least resolver address

What it means

NewResolver in internal/resolver returns this error when given an empty address list. A custom resolver needs at least one DNS server address to replace net.DefaultResolver's behavior.

Source

Thrown at internal/resolver/resolver.go:26

	"strconv"
	"strings"
	"sync/atomic"
)

type resolver struct {
	addrs  []string
	dialer *net.Dialer
	idx    uint64
}

// NewResolver - create a new instance of a dns resolver for plugging
// into net.DefaultResolver.  Addresses should be a list of
// ip addrs and optional port numbers, separated by colon.
// For example: 1.2.3.4:53 and 1.2.3.4 are both valid.  In the absence
// of a port number, 53 will be used instead.
func NewResolver(addrs []string) (*net.Resolver, error) {
	if len(addrs) == 0 {
		return nil, errors.New("must specify at least resolver address")
	}
	cleanAddrs, err := normalizeAddrs(addrs)
	if err != nil {
		return nil, err
	}
	return &net.Resolver{
		PreferGo: true,
		Dial:     (&resolver{addrs: cleanAddrs, dialer: &net.Dialer{}}).dial,
	}, nil
}

func normalizeAddrs(addrs []string) ([]string, error) {
	normal := make([]string, len(addrs))
	for i, addr := range addrs {

		// if addr has no port, give it 53
		if !strings.Contains(addr, ":") {
			addr += ":53"

View on GitHub (pinned to cf58112690)

Solutions

  1. Pass at least one address, e.g. NewResolver([]string{"8.8.8.8:53"}).
  2. Trim and check the addresses input before calling NewResolver and fall back to net.DefaultResolver if empty.
  3. Fix the flag/config parsing so an empty value doesn't produce a nil/empty slice passed as non-optional.

Example fix

// before
r, err := resolver.NewResolver(addrs) // addrs == nil
// after
if len(addrs) == 0 { addrs = []string{"8.8.8.8:53"} }
r, err := resolver.NewResolver(addrs)
Defensive patterns

Strategy: validation

Validate before calling

if len(addrs) == 0 {
    addrs = nil // fall back to net.DefaultResolver
}
var r *net.Resolver
if len(addrs) > 0 {
    r, err = resolver.NewResolver(addrs)
}

Prevention

When it happens

Trigger: Calling resolver.NewResolver(nil) or NewResolver([]string{}) — e.g. constructing an attacker with resolver addresses sourced from an empty flag/env value.

Common situations: Empty `-dns` style flag, config file with no resolver entries, or splitting an empty string into a zero-length slice.

Understand the failure class

Background: Missing required parameter errors: what 'X is required' and 'the required X param is missing' mean, and how to fix them — this error's family across 27 libraries.

Related errors


AI-assisted analysis of tsenart/vegeta@cf58112690 (2026-08-31). Data as JSON: /api/errors/c3b135e5ab339c3c. Report an issue: GitHub.