projectdiscovery/nuclei · critical

dialers with executionId %s not found

Error message

dialers with executionId %s not found

What it means

ListInputProvider.Set panicked because protocolstate.GetDialersWithId(executionId) returned nil for the given execution id. When ScanAllIPs is enabled, Set must resolve DNS via the per-execution Dialers (fastdialer + network policy); dialers are registered by protocolstate.Init(types.Options) keyed on Options.ExecutionId, so a missing entry means Init never ran or ran with a different id. The panic (not an error return) crashes the process.

Source

Thrown at pkg/input/provider/list/hmap.go:175

		metaInput := contextargs.NewMetaInput()
		metaInput.Input = URL
		i.setItem(metaInput)
		return
	}

	// Check if input is ip or hostname
	if iputil.IsIP(urlx.Hostname()) {
		metaInput := contextargs.NewMetaInput()
		metaInput.Input = URL
		i.setItem(metaInput)
		return
	}

	if i.ipOptions.ScanAllIPs {
		// scan all ips
		dialers := protocolstate.GetDialersWithId(executionId)
		if dialers == nil {
			panic("dialers with executionId " + executionId + " not found")
		}

		dnsData, err := dialers.Fastdialer.GetDNSData(urlx.Hostname())
		if err == nil {
			if (len(dnsData.A) + len(dnsData.AAAA)) > 0 {
				var ips []string
				if i.ipOptions.IPV4 {
					ips = append(ips, dnsData.A...)
				}
				if i.ipOptions.IPV6 {
					ips = append(ips, dnsData.AAAA...)
				}
				for _, ip := range ips {
					if ip == "" {
						continue
					}
					metaInput := contextargs.NewMetaInput()
					metaInput.Input = URL

View on GitHub (pinned to 265b3a3dec)

Solutions

  1. Call protocolstate.Init(options) (the runner does this) with the same types.Options.ExecutionId you pass to Set before pushing inputs.
  2. Prefer the standard path: let internal/runner create and drive the input provider so Init ordering is guaranteed.
  3. Use protocolstate.ShouldInit(executionId) as a pre-check right before Set when ids are dynamic.
  4. If you maintain a fork, consider converting this panic into an error return; meanwhile guard it explicitly.

Example fix

// before
provider.Set(executionId, "scanme.sh") // panics: dialers never initialized

// after
if protocolstate.ShouldInit(executionId) {
    if err := protocolstate.Init(opts); err != nil { // opts.ExecutionId == executionId
        return err
    }
}
provider.Set(executionId, "scanme.sh")
Defensive patterns

Strategy: validation

Validate before calling

if i.ipOptions.ScanAllIPs && protocolstate.ShouldInit(executionId) {
    if err := protocolstate.Init(opts /* opts.ExecutionId == executionId */); err != nil {
        return err
    }
}
provider.Set(executionId, target)

Try / catch

// panic, not error: there is nothing to catch in-process; validate before calling.
// In tests, use require/assert around the Set call so a panic names the failing line.

Prevention

When it happens

Trigger: Embedding nuclei via lib/ SDK or calling Set() directly with -scan-all-ips style ipOptions before protocolstate.Init registered dialers for that executionId; passing a mismatched/empty executionId string between the caller and the one used during Init; calling Set after dialers were torn down for the id.

Common situations: SDK users constructing their own input provider instead of letting the runner set everything up; concurrent executions reusing one provider with per-run execution ids where one run skipped Init; upstream refactors that made ExecutionId mandatory when it used to be a single global dialer.

Related errors


AI-assisted analysis of projectdiscovery/nuclei@265b3a3dec (2026-08-15). Data as JSON: /api/errors/af33aeea2ca04a90. Report an issue: GitHub.