def _add_default_issue_metadata(testcase): """Adds the default issue metadata (e.g. components, labels) to testcase.""" default_metadata = engine_common.get_all_issue_metadata_for_testcase( testcase) if not default_metadata: return testcase_metadata = testcase.get_metadata() for key, default_value in six.iteritems(default_metadata): # Add the default issue metadata first. This gives preference to uploader # specified issue metadata. new_value_list = utils.parse_delimited(default_value, delimiter=',', strip=True, remove_empty=True) # Append uploader specified testcase metadata value to end (for preference). uploader_value = testcase_metadata.get(key, '') uploader_value_list = utils.parse_delimited(uploader_value, delimiter=',', strip=True, remove_empty=True) for value in uploader_value_list: if value not in new_value_list: new_value_list.append(value) new_value = ','.join(new_value_list) if new_value == uploader_value: continue logs.log('Updating issue metadata for {} from {} to {}.'.format( key, uploader_value, new_value)) testcase.set_metadata(key, new_value)
def _update_issue_metadata(testcase): """Update issue metadata.""" if testcase.uploader_email: # Trust the uploader specified metadata. return metadata = engine_common.get_all_issue_metadata_for_testcase(testcase) if not metadata: return for key, value in six.iteritems(metadata): old_value = testcase.get_metadata(key) if old_value != value: logs.log('Updating issue metadata for {} from {} to {}.'.format( key, old_value, value)) testcase.set_metadata(key, value)
def _process_corpus_crashes(context, result): """Process crashes found in the corpus.""" # Default Testcase entity values. crash_revision = result.revision job_type = environment.get_value("JOB_NAME") minimized_arguments = "%TESTCASE% " + context.fuzz_target.binary project_name = data_handler.get_project_name(job_type) comment = "Fuzzer %s generated corpus testcase crashed (r%s)" % ( context.fuzz_target.project_qualified_name(), crash_revision, ) # Generate crash reports. for crash in result.crashes: existing_testcase = data_handler.find_testcase(project_name, crash.crash_type, crash.crash_state, crash.security_flag) if existing_testcase: continue # Upload/store testcase. if environment.is_trusted_host(): from bot.untrusted_runner import file_host unit_path = os.path.join(context.bad_units_path, os.path.basename(crash.unit_path)) # Prevent the worker from escaping out of |context.bad_units_path|. if not file_host.is_directory_parent(unit_path, context.bad_units_path): raise CorpusPruningException("Invalid units path from worker.") file_host.copy_file_from_worker(crash.unit_path, unit_path) else: unit_path = crash.unit_path with open(unit_path, "rb") as f: key = blobs.write_blob(f) # Set the absolute_path property of the Testcase to a file in FUZZ_INPUTS # instead of the local quarantine directory. absolute_testcase_path = os.path.join( environment.get_value("FUZZ_INPUTS"), "testcase") testcase_id = data_handler.store_testcase( crash=crash, fuzzed_keys=key, minimized_keys="", regression="", fixed="", one_time_crasher_flag=False, crash_revision=crash_revision, comment=comment, absolute_path=absolute_testcase_path, fuzzer_name=context.fuzz_target.engine, fully_qualified_fuzzer_name=context.fuzz_target. fully_qualified_name(), job_type=job_type, archived=False, archive_filename="", binary_flag=True, http_flag=False, gestures=None, redzone=DEFAULT_REDZONE, disable_ubsan=False, minidump_keys=None, window_argument=None, timeout_multiplier=1.0, minimized_arguments=minimized_arguments, ) # Set fuzzer_binary_name in testcase metadata. testcase = data_handler.get_testcase_by_id(testcase_id) testcase.set_metadata("fuzzer_binary_name", result.fuzzer_binary_name) issue_metadata = engine_common.get_all_issue_metadata_for_testcase( testcase) if issue_metadata: for key, value in issue_metadata.items(): testcase.set_metadata(key, value, update_testcase=False) testcase.put() # Create additional tasks for testcase (starting with minimization). testcase = data_handler.get_testcase_by_id(testcase_id) task_creation.create_tasks(testcase)