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.
Solutions
- Run signature generation first so the directory contains sigs_* files.
- Point sendSignaturesToServer at the directory that actually holds the generated sigs_* files.
- 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
- Run generatesigs before ingest so the directory holds sigs_* files.
- Keep the generation filter and ingest filter consistent.
- Point ingest at the actual output directory.
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.
Appendix: 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)