def combine_ipc_dumps(ipcdumps, original_file_path): """Combines a list of ipcdump files into a single dump.""" input_file_string = ','.join(ipcdumps) executable = get_ipc_message_util_executable() output_file_path = get_temporary_file_name(original_file_path) command_line = shell.get_command_line_from_argument_list( [executable, input_file_string, output_file_path]) return_code, _, output = process_handler.run_process( command_line, testcase_run=False, timeout=COMBINED_IPCDUMP_TIMEOUT) for ipcdump in ipcdumps: shell.remove_file(ipcdump) if return_code or not os.path.exists(output_file_path): logs.log_error('Failed to create ipc dump file %s.' % output) return None return output_file_path
def tokenize(current_file_path): """Generate a token list for an IPC fuzzer test case.""" command_line = shell.get_command_line_from_argument_list( [get_ipc_message_util_executable(), '--dump', current_file_path]) _, _, output = process_handler.run_process( command_line, testcase_run=False, timeout=IPCDUMP_TIMEOUT) output_lines = output.splitlines() if not output_lines: return [] # Each output line starts with the message index followed by a ".", but # we are only interested in the total number of messages in the file. To # find this, we add one to the index of the final message. try: last_index = int(output_lines[-1].split('.')[0]) except ValueError: return [] return list(range(last_index + 1))
def create_partial_ipc_dump(tokens, original_file_path): """Use the ipc_message_util utility to create a file for up to |TOKENS_PER_IPCDUMP| tokens.""" assert len(tokens) <= TOKENS_PER_IPCDUMP token_list = ','.join([str(token) for token in tokens]) temp_file_path = get_temporary_file_name(original_file_path) executable = get_ipc_message_util_executable() command_line = shell.get_command_line_from_argument_list( [executable, '--in=%s' % token_list, original_file_path, temp_file_path]) return_code, _, output = process_handler.run_process( command_line, testcase_run=False, timeout=IPCDUMP_TIMEOUT) if return_code or not os.path.exists(temp_file_path): # For some reason, generating the new file failed. logs.log_error('Failed to create ipc dump file %s.' % output) return None return temp_file_path
def supports_ipc_minimization(file_path): """Check to see if IPC minimization is supported for the current build.""" executable = get_ipc_message_util_executable() if not executable: # IPC fuzzer minimization is not supported on this platform. return False command_line = shell.get_command_line_from_argument_list( [executable, '--dump', '--in=0', file_path]) return_code, _, output = process_handler.run_process( command_line, testcase_run=False, timeout=IPCDUMP_TIMEOUT) # If --in is not supported by this version of the ipc_message_util binary, # it will exit with a nonzero exit status. Also ensure that the first message # is printed in case the build is bad for some other reason. # Example output: 0. AutofillHostMsg_DidFillAutofillFormData if return_code or not output.startswith('0.'): return False supports_ipc_minimization.is_supported = True return True