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

  1. Check the wordlist file exists and is non-empty (wc -l wordlist.txt)
  2. Confirm the downloaded content is the actual wordlist, not an error page
  3. Point --wordlist at a known-good list (e.g. raft/seclists)
  4. 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

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


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)