{"record":{"id":"8e30c0b2f66efc1d","repo":"NationalSecurityAgency/ghidra","slug":"exespecifier-must-provide-either-md5-or-name","errorCode":null,"errorMessage":"ExeSpecifier must provide either md5 or name","messagePattern":"ExeSpecifier must provide either md5 or name","errorType":"validation","errorClass":"LSHException","httpStatus":null,"severity":"error","filePath":"Ghidra/Features/BSim/src/main/java/ghidra/features/bsim/query/client/AbstractSQLFunctionDatabase.java","lineNumber":1504,"sourceCode":"\n\t\tfor (ExecutableRow row : rows) {\n\t\t\tExecutableRecord record = exeTable.makeExecutableRecord(manager, row);\n\t\t\trecords.add(record);\n\t\t}\n\t\treturn records;\n\t}\n\n\tprivate ExecutableRecord findSingleExecutable(ExeSpecifier spec, DescriptionManager manager)\n\t\t\tthrows SQLException, LSHException {\n\t\tif (!StringUtils.isBlank(spec.exemd5)) {\n\t\t\tExecutableRow row = exeTable.queryMd5ExeMatch(spec.exemd5);\n\t\t\tif (row == null) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn exeTable.makeExecutableRecord(manager, row);\n\t\t}\n\t\tif (StringUtils.isBlank(spec.exename)) {\n\t\t\tthrow new LSHException(\"ExeSpecifier must provide either md5 or name\");\n\t\t}\n\t\treturn exeTable.querySingleExecutable(manager, spec.exename, spec.arch, spec.execompname);\n\t}\n\n\tprivate ExecutableRecord findSingleExeWithMap(ExeSpecifier exe, DescriptionManager manager,\n\t\t\tTreeMap<ExeSpecifier, ExecutableRecord> nameMap) throws SQLException, LSHException {\n\t\tExecutableRecord erec = nameMap.get(exe);\n\t\tif (erec != null) {\n\t\t\treturn erec;\n\t\t}\n\t\terec = findSingleExecutable(exe, manager);\n\t\tnameMap.put(exe, erec);\t\t\t// Cache ExecutableRecord in map, even if its null\n\t\treturn erec;\n\t}\n\n\t/**\n\t * Query for an executable via its md5 hash\n\t * @param md5 is the 32-character md5 hash","sourceCodeStart":1486,"sourceCodeEnd":1522,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Features/BSim/src/main/java/ghidra/features/bsim/query/client/AbstractSQLFunctionDatabase.java#L1486-L1522","documentation":"`findSingleExecutable` requires at least one identifier on the ExeSpecifier. If both `exemd5` and `exename` are blank, it throws LSHException -- the lookup has no anchor to resolve an executable.","triggerScenarios":"Constructing an ExeSpecifier and leaving both exeMd5 and exeName blank/empty, then passing it into a query path that calls findSingleExecutable.","commonSituations":"Programmatic ExeSpecifier construction with missing fields; deserialization gaps from a malformed request; filter-builder bugs that omit the identifier.","solutions":["Populate at least one of exeMd5 or exeName on the ExeSpecifier.","Validate the specifier before issuing the query.","Prefer exeMd5 for unambiguous resolution."],"exampleFix":"// before\nExeSpecifier spec = new ExeSpecifier();   // both blank -- throws\n// after\nExeSpecifier spec = new ExeSpecifier();\nspec.exename = \"myapp\";\nspec.arch   = \"x86:LE:64:default\";","handlingStrategy":"validation","validationCode":"// Require at least one identifier before querying.\nif (StringUtils.isBlank(spec.exemd5) && StringUtils.isBlank(spec.exename)) {\n    throw new IllegalArgumentException(\n        \"ExeSpecifier needs either exeMd5 or exeName\");\n}","typeGuard":"// isExeSpecifierResolvable: true iff the spec has at least one anchor.\nstatic boolean isExeSpecifierResolvable(ExeSpecifier s) {\n    return StringUtils.isNotBlank(s.exemd5) || StringUtils.isNotBlank(s.exename);\n}","tryCatchPattern":"try {\n    return db.findSingleExecutable(spec, manager);\n} catch (LSHException e) {\n    if (e.getMessage().equals(\"ExeSpecifier must provide either md5 or name\")) {\n        throw new IllegalArgumentException(\"Provide exeMd5 or exeName on the filter\", e);\n    }\n    throw e;\n}","preventionTips":["Validate ExeSpecifier at construction or via a builder that requires an identifier.","Prefer exeMd5 for unambiguous resolution.","Unit-test filter builders to ensure an identifier is always set."],"tags":["validation","api-usage","query","bsim"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}