{"record":{"id":"4b44e95413210ddf","repo":"NationalSecurityAgency/ghidra","slug":"parameter-name-conflict-likely-due-to-concurrent","errorCode":null,"errorMessage":"Parameter name conflict, likely due to concurrent operation","messagePattern":"Parameter name conflict, likely due to concurrent operation","errorType":"exception","errorClass":"InvalidInputException","httpStatus":null,"severity":"error","filePath":"Ghidra/Features/Base/src/main/java/ghidra/app/cmd/function/ApplyFunctionSignatureCmd.java","lineNumber":213,"sourceCode":"\t\t\tList<Parameter> params =\n\t\t\t\tcreateParameters(compilerSpec, conventionName, args, returnParam);\n\n\t\t\tSymbolTable symbolTable = program.getSymbolTable();\n\n\t\t\tadjustParameterNamesToAvoidConflicts(symbolTable, func, params);\n\n\t\t\tfunc.updateFunction(conventionName, returnParam, params,\n\t\t\t\tFunctionUpdateType.DYNAMIC_STORAGE_FORMAL_PARAMS, false, source);\n\t\t\tfunc.setVarArgs(signature.hasVarArgs());\n\n\t\t\t// Only apply noreturn if signature has it set\n\t\t\tif (signature.hasNoReturn()) {\n\t\t\t\tfunc.setNoReturn(signature.hasNoReturn());\n\t\t\t}\n\t\t}\n\t\tcatch (DuplicateNameException e) {\n\t\t\t// should not happen unless caused by a concurrent operation\n\t\t\tthrow new InvalidInputException(\n\t\t\t\t\"Parameter name conflict, likely due to concurrent operation\");\n\t\t}\n\t\tfinally {\n\t\t\tif (dtCleaner != null) {\n\t\t\t\tdtCleaner.close();\n\t\t\t}\n\t\t}\n\n\t\tupdateStackPurgeSize(func, program);\n\n\t\treturn true;\n\t}\n\n\tprivate List<Parameter> createParameters(CompilerSpec compilerSpec, String conventionName,\n\t\t\tParameterDefinition[] args, Parameter returnParam) throws InvalidInputException {\n\n\t\tDataType returnDt = returnParam.getDataType();\n","sourceCodeStart":195,"sourceCodeEnd":231,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Features/Base/src/main/java/ghidra/app/cmd/function/ApplyFunctionSignatureCmd.java#L195-L231","documentation":"Thrown by ApplyFunctionSignatureCmd.setSignature after it catches a DuplicateNameException from func.updateFunction(...). The command pre-adjusts parameter names via adjustParameterNamesToAvoidConflicts, so a DuplicateNameException at the update call is unexpected and is attributed to a concurrent modification of the function's parameters. It is rethrown as InvalidInputException with this message.","triggerScenarios":"Applying a function signature while another thread/analysis worker renames or adds parameters to the same function. The transaction model normally serializes this, but a race between two updaters (or re-entrant analysis) can surface it.","commonSituations":"Multi-threaded scripting that mutates the same function from parallel workers. Running ApplyFunctionSignatureCmd concurrently with auto-analysis that touches function parameters. Re-entrant command application without a stable transaction.","solutions":["Perform function-signature updates inside a single program transaction and avoid concurrent modification of the same function.","Retry the command once after a brief yield - the conflict may be transient.","Disable or suspend auto-analysis while bulk-applying signatures.","Ensure only one worker mutates a given function at a time."],"exampleFix":"// before\nnew ApplyFunctionSignatureCmd(entry, sig, source).applyTo(program);\n// concurrent modification -> InvalidInputException\n\n// after - serialize updates and retry once\nint tx = program.startTransaction(\"apply sig\");\ntry {\n    new ApplyFunctionSignatureCmd(entry, sig, source).applyTo(program);\n} catch (InvalidInputException e) {\n    Thread.sleep(50); // yield to the other worker\n    new ApplyFunctionSignatureCmd(entry, sig, source).applyTo(program);\n} finally {\n    program.endTransaction(tx, true);\n}","handlingStrategy":"retry","validationCode":"// No pure pre-check; serialize function mutations to avoid the race.\n// Acquire a per-function lock before applying signatures.","typeGuard":null,"tryCatchPattern":"try {\n    cmd.applyTo(program);\n} catch (Exception e) { // applyTo wraps InvalidInputException via status\n    if (e.getMessage().contains(\"Parameter name conflict\")) {\n        // yield and retry once\n        Thread.sleep(50);\n        cmd.applyTo(program);\n    } else throw e;\n}","preventionTips":["Serialize function-signature updates within a single transaction.","Suspend auto-analysis while bulk-applying signatures.","Avoid parallel workers mutating the same function."],"tags":["function","signature","concurrency","command"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}