NationalSecurityAgency/ghidra · error · IOException

No update files found in {}

Error message

No update files found in {}

What it means

Thrown by BulkSignatures.sendUpdateToServer when gatherXml('update_', dir) returns an empty list. Analogous to the 'no signature files' error, the directory was readable but contained no metadata-update files prefixed 'update_', so there is nothing to send and the method aborts.

Source

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

			if (insertreq.execute(querydb) == null) {
				BSimError lastError = querydb.getLastError();
				if ((lastError.category == ErrorCategory.Format) ||
					(lastError.category == ErrorCategory.Nonfatal)) {
					Msg.warn(this, file.getName() + ": " + lastError.message);
				}
				else {
					throw new IOException(file.getName() + ": " + lastError.message);
				}
			}
		}
	}

	protected void sendUpdateToServer(File dir) throws IOException, SAXException, LSHException {
		establishQueryServerConnection(true);
		List<File> files = gatherXml("update_", dir);

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

		for (File file : files) {
			Msg.info(this, "Updating metadata for " + file.getName());
			QueryUpdate update = new QueryUpdate();
			loadSignatureXml(file, update.manage);
			ResponseUpdate respup = update.execute(querydb);
			if (respup == null) {
				BSimError lastError = querydb.getLastError();
				if ((lastError.category == ErrorCategory.Format) ||
					(lastError.category == ErrorCategory.Nonfatal)) {
					Msg.warn(this, file.getName() + ": " + lastError.message);
				}
				else {
					throw new IOException(file.getName() + ": " + lastError.message);
				}
			}
			else {

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Generate the update XML files first so the directory contains update_* entries.
  2. Point sendUpdateToServer at the directory holding the update_* files.
  3. Verify the generation step wrote update_* files (vs sigs_*).

Example fix

// before
bsim.sendUpdateToServer(new File("sigs-out"));  // contains sigs_* not update_*

// after
bsim.sendUpdateToServer(new File("update-out"));  // directory with update_* files
Defensive patterns

Strategy: validation

Validate before calling

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

Try / catch

try {
    bsim.sendUpdateToServer(dir);
} catch (IOException e) {
    if (e.getMessage().startsWith("No update files found")) {
        // generate updates first, then retry
    } else { throw e; }
}

Prevention

When it happens

Trigger: Running sendUpdateToServer against a directory lacking update_* files; update XML generated into a different folder; updates not yet generated.

Common situations: Forgetting the generate-updates step; pointing at the sigs directory instead of the update directory; cleanup that removed update files.

Related errors


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