epi052/feroxbuster · error
Did not find any words in
Error message
Did not find any words in {} What it means
After loading the wordlist (file or remote), wrapped_main checks if words.len() <= 1; since 2.6.0 an initial empty string is added, so 1 means an empty wordlist and 0 an error. Either way there are no words to scan with, so it bails naming the wordlist source(s).
Solutions
- Check the wordlist file exists and is non-empty (wc -l wordlist.txt)
- Confirm the downloaded content is the actual wordlist, not an error page
- Point --wordlist at a known-good list (e.g. raft/seclists)
- Remove filters or transformations that strip all entries
Example fix
// before ferox -u https://t.com --wordlist ./empty.txt // after ferox -u https://t.com --wordlist /usr/share/seclists/Discovery/Web-Content/common.txt
Defensive patterns
Strategy: validation
Validate before calling
const lines = fs.readFileSync(wordlistPath, 'utf8').split('\n').filter(l => l.trim()); if (lines.length === 0) throw new Error('wordlist is empty'); Prevention
- Run wc -l on wordlists before use
- Confirm downloaded wordlists are not HTML error pages
- Keep known-good wordlists locally and reference them explicitly
When it happens
Trigger: --wordlist points at an empty file, a file containing only blank lines/comments filtered out, or a remote wordlist whose body produced zero usable entries.
Common situations: Typos in the local wordlist path resolved via config to an empty file, a downloaded wordlist that was actually an HTML error page with no valid lines, or pipes/filters (e.g. --filter-status pipelines) emptying the list.
Understand the failure class
Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.
Related errors
- Could not get underlying wordlist
- The regex ' ' matches ; the scan will never start
- The url ' ' matches ; the scan will never start
- [ ] Unable to download wordlist from url
- Unable to parse path from url
AI-assisted analysis of epi052/feroxbuster@1f595dab5c (2026-09-13).
Data as JSON: /api/errors/ed2b89ca3f5e8279.
Report an issue: GitHub.
Appendix: source
Thrown at src/main.rs:318
if single_local_source && Path::new(SECONDARY_WORDLIST).exists() {
eprintln!("Found wordlist in secondary location");
append_words_from_path(SECONDARY_WORDLIST, &mut words, &mut seen)?;
} else {
return Err(err);
}
}
}
}
}
Arc::new(words)
};
if words.len() <= 1 {
// the check is now <= 1 due to the initial empty string added in 2.6.0
// 1 -> empty wordlist
// 0 -> error
bail!("Did not find any words in {}", config.wordlist.join(", "));
}
// spawn all event handlers, expect back a JoinHandle and a *Handle to the specific event
let (stats_task, stats_handle) = StatsHandler::initialize(config.clone());
let (filters_task, filters_handle) = FiltersHandler::initialize();
let (out_task, out_handle) =
TermOutHandler::initialize(config.clone(), stats_handle.tx.clone());
// bundle up all the disparate handles and JoinHandles (tasks)
let handles = Arc::new(Handles::new(
stats_handle,
filters_handle,
out_handle,
config.clone(),
words,
));
let (scan_task, scan_handle) = ScanHandler::initialize(handles.clone());View on GitHub (pinned to 1f595dab5c)