diff --git a/src/vuln_analysis/utils/function_name_extractor.py b/src/vuln_analysis/utils/function_name_extractor.py index 7f955f330..d58b2a789 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 @@ -69,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(")")