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 = URLView on GitHub (pinned to 265b3a3dec)
Solutions
- Call protocolstate.Init(options) (the runner does this) with the same types.Options.ExecutionId you pass to Set before pushing inputs.
- Prefer the standard path: let internal/runner create and drive the input provider so Init ordering is guaranteed.
- Use protocolstate.ShouldInit(executionId) as a pre-check right before Set when ids are dynamic.
- 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
- Single source of truth for ExecutionId across Init/Set/Del.
- Call protocolstate.Init before constructing or populating the input provider.
- Prefer runner-managed input handling in SDK integrations.
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
- dialers with executionId {executionId} not found
- dialers with executionId {executionId} not found
- dialers not initialized for execution id: {ExecutionId}
- dialers not initialized for %s
- ipv4 and/or ipv6 must be selected
AI-assisted analysis of projectdiscovery/nuclei@265b3a3dec (2026-08-15).
Data as JSON: /api/errors/af33aeea2ca04a90.
Report an issue: GitHub.