NationalSecurityAgency/ghidra · error · IOException

No signature files found in {}

Error message

No signature files found in {}

What it means

Thrown by BulkSignatures.sendSignaturesToServer after gatherXml returns an empty list, i.e. no files matching the 'sigs_<filter>' prefix were found in the given directory. The directory was readable but contained no signature files to ingest, so the operation aborts rather than silently doing nothing.

Source

Thrown at Ghidra/Features/BSim/src/main/java/ghidra/features/bsim/query/ingest/BulkSignatures.java:187

		ErrorHandler handler = SpecXmlUtils.getXmlHandler();
		XmlPullParser parser = new NonThreadedXmlPullParserImpl(file, handler, false);
		manage.restoreXml(parser, querydb.getLSHVectorFactory());
	}

	protected void sendXmlToQueryServer(File dir, URL ghidraOverrideURL, String filter,
			TaskMonitor monitor)
			throws IOException, SAXException, LSHException, CancelledException {
		establishQueryServerConnection(true);
		if (filter == null) {
			filter = "sigs_";
		}
		else {
			filter = "sigs_" + filter;
		}
		List<File> files = gatherXml(filter, dir);

		if (files.isEmpty()) {
			throw new IOException("No signature files found in " + dir.getAbsolutePath());
		}

		monitor.setMessage("Writing signatures");
		monitor.setMaximum(files.size());

		for (File file : files) {
			monitor.checkCancelled();
			monitor.incrementProgress(1);
			Msg.info(this, "Writing signatures for " + file.getName());
			InsertRequest insertreq = new InsertRequest();
			if (ghidraOverrideURL != null) {
				insertreq.repo_override =
					GhidraURL.getProjectURL(ghidraOverrideURL).toExternalForm();
				insertreq.path_override = GhidraURL.getProjectPathname(ghidraOverrideURL);
			}
			loadSignatureXml(file, insertreq.manage);
			if (insertreq.manage.numFunctions() == 0) {
				Msg.warn(this, file.getName() + ": does not define any functions");

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Run signature generation first so the directory contains sigs_* files.
  2. Point sendSignaturesToServer at the directory that actually holds the generated sigs_* files.
  3. If using a custom filter, ensure the generation and ingest prefixes agree (filter is prepended with 'sigs_').

Example fix

// before
bsim.sendSignaturesToServer(new File("out"), "exe1", monitor);  // no sigs_exe1_* files

// after
// generate with matching filter, then ingest
bsim.sendSignaturesToServer(new File("out"), null, monitor);  // or correct filter token
Defensive patterns

Strategy: validation

Validate before calling

File dir = new File(path);
String prefix = (filter == null ? "sigs_" : "sigs_" + filter);
File[] matches = dir.listFiles((d, n) -> n.startsWith(prefix));
if (matches == null || matches.length == 0) {
    throw new IOException("No " + prefix + "* files in " + dir);
}

Try / catch

try {
    bsim.sendSignaturesToServer(dir, filter, monitor);
} catch (IOException e) {
    if (e.getMessage().startsWith("No signature files found")) {
        // generate sigs first, then retry
    } else { throw e; }
}

Prevention

When it happens

Trigger: Running ingest (sendSignaturesToServer) against a directory that has no files starting with the expected prefix; generatesigs output written elsewhere or to a different prefix; filter argument mismatches generated names.

Common situations: Forgetting to run 'generatesigs' first; pointing ingest at the wrong output folder; the filter token does not match the prefix used during generation; files were moved/deleted.

Related errors


AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14). Data as JSON: /api/errors/109257accf80b9f4. Report an issue: GitHub.