From f11ad37af994872f4616ecc405a7b10f76eb8dc1 Mon Sep 17 00:00:00 2001 From: Shimon Tanny Date: Wed, 8 Jul 2026 13:35:00 +0300 Subject: [PATCH 1/2] feat: Escape regex metacharacters in Function Caller Finder APPENG-5614: Fix regex escaping in function_name_extractor Escape regex metacharacters (., [], +, etc.) in function name prefix so identifiers like "protojson.Unmarshal" or "[]byte" are treated as literals instead of regex patterns. Note: The other changes from APPENG-5614 (pre-indexing, dedup, DFS ordering in chain_of_calls_retriever.py) are already in main. Split from: RHEcosystemAppEng/exploit-iq-agent#261 Signed-off-by: RedTanny Co-authored-by: Cursor --- src/vuln_analysis/utils/function_name_extractor.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/vuln_analysis/utils/function_name_extractor.py b/src/vuln_analysis/utils/function_name_extractor.py index 7f955f330..c14785d6b 100644 --- a/src/vuln_analysis/utils/function_name_extractor.py +++ b/src/vuln_analysis/utils/function_name_extractor.py @@ -25,9 +25,12 @@ def traverse_all_parameters(function_ending_index_end, function_prefix_index_end, function_string): current_idx = function_prefix_index_end - function_builder = function_string[:function_prefix_index_end] + # Escape the function name prefix so regex metacharacters (., [], +, etc.) + # in identifiers like "protojson.Unmarshal" or "[]byte" are treated as literals. + prefix_name = function_string[:function_prefix_index_end - 1] + function_builder = re.escape(prefix_name) + r"\(" if current_idx == function_ending_index_end: - function_builder += ")" + function_builder += r"\)" while current_idx < function_ending_index_end: end_of_arg_ind = function_string[current_idx:].find(",") if end_of_arg_ind > -1: @@ -37,7 +40,7 @@ def traverse_all_parameters(function_ending_index_end, function_prefix_index_end else: # last argument value = handle_argument(function_string[current_idx:function_ending_index_end].strip()) - function_builder += f"\\s?{value}\\s?)" + function_builder += f"\\s?{value}\\s?\\)" current_idx = function_ending_index_end return function_builder From 7bf1115a2fef5ebdf9bdcb750e46cffe5146579d Mon Sep 17 00:00:00 2001 From: Shimon Tanny Date: Wed, 8 Jul 2026 15:19:53 +0300 Subject: [PATCH 2/2] CodeReview escape param --- src/vuln_analysis/utils/function_name_extractor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/vuln_analysis/utils/function_name_extractor.py b/src/vuln_analysis/utils/function_name_extractor.py index c14785d6b..d58b2a789 100644 --- a/src/vuln_analysis/utils/function_name_extractor.py +++ b/src/vuln_analysis/utils/function_name_extractor.py @@ -72,7 +72,7 @@ def handle_argument(param: str) -> str: :return: returns the right matcher. """ if (param.startswith("'") and param.endswith("'")) or (param.startswith('"') and param.endswith('"')): - return param + return re.escape(param) elif param.__contains__("(") and param.__contains__(")"): function_prefix_index_end = param.find("(") + 1 function_ending_index_end = param.rfind(")")