diff --git a/infra/gcb/build.py b/infra/gcb/build.py index e6523cc61..51afc0581 100755 --- a/infra/gcb/build.py +++ b/infra/gcb/build.py @@ -6,6 +6,7 @@ Usage: build.py """ import base64 +import collections import datetime import os import subprocess @@ -18,15 +19,28 @@ from oauth2client.client import GoogleCredentials from oauth2client.service_account import ServiceAccountCredentials from googleapiclient.discovery import build - CONFIGURATIONS = { 'sanitizer-address' : [ 'SANITIZER=address' ], 'sanitizer-memory' : [ 'SANITIZER=memory' ], 'sanitizer-undefined' : [ 'SANITIZER=undefined' ], - } + 'engine-libfuzzer' : [ 'FUZZING_ENGINE=libfuzzer' ], + 'engine-afl' : [ 'FUZZING_ENGINE=afl' ], +} +EngineInfo = collections.namedtuple( + 'EngineInfo', ['upload_bucket', 'supported_sanitizers']) + +ENGINE_INFO = { + 'libfuzzer': EngineInfo( + upload_bucket='clusterfuzz-builds-test', + supported_sanitizers=['address', 'memory', 'undefined']), + 'afl': EngineInfo( + upload_bucket='clusterfuzz-builds-afl-test', + supported_sanitizers=['address']), +} + +DEFAULT_ENGINES = ['libfuzzer', 'afl'] DEFAULT_SANITIZERS = ['address', 'undefined'] -UPLOAD_BUCKET = 'clusterfuzz-builds-test' def usage(): @@ -44,6 +58,7 @@ def load_project_yaml(project_dir): project_yaml.setdefault('image', 'gcr.io/clusterfuzz-external/oss-fuzz/' + project_name) project_yaml.setdefault('sanitizers', DEFAULT_SANITIZERS) + project_yaml.setdefault('fuzzing_engines', DEFAULT_ENGINES) return project_yaml @@ -66,6 +81,10 @@ def get_signed_url(path): urllib.urlencode(values)) +def is_supported_configuration(fuzzing_engine, sanitizer): + return sanitizer in ENGINE_INFO[fuzzing_engine].supported_sanitizers + + def get_build_steps(project_yaml): name = project_yaml['name'] image = project_yaml['image'] @@ -94,60 +113,66 @@ def get_build_steps(project_yaml): }, ] - for sanitizer in project_yaml['sanitizers']: - env = CONFIGURATIONS["sanitizer-" + sanitizer][:] - out = '/workspace/out/' + sanitizer - stamped_name = name + '-' + sanitizer + '-' + ts - zip_file = stamped_name + '.zip' - stamped_srcmap_file = stamped_name + '.srcmap.json' - upload_url = get_signed_url('/{0}/{1}/{2}'.format( - UPLOAD_BUCKET, name, zip_file)) - srcmap_url = get_signed_url('/{0}/{1}/{2}'.format( - UPLOAD_BUCKET, name, stamped_srcmap_file)) + for fuzzing_engine in project_yaml['fuzzing_engines']: + for sanitizer in project_yaml['sanitizers']: + if not is_supported_configuration(fuzzing_engine, sanitizer): + continue - env.append('OUT=' + out) + env = CONFIGURATIONS['engine-' + fuzzing_engine][:] + env.extend(CONFIGURATIONS['sanitizer-' + sanitizer]) + out = '/workspace/out/' + sanitizer + stamped_name = name + '-' + sanitizer + '-' + ts + zip_file = stamped_name + '.zip' + stamped_srcmap_file = stamped_name + '.srcmap.json' + bucket = ENGINE_INFO[fuzzing_engine].upload_bucket + upload_url = get_signed_url('/{0}/{1}/{2}'.format( + bucket, name, zip_file)) + srcmap_url = get_signed_url('/{0}/{1}/{2}'.format( + bucket, name, stamped_srcmap_file)) - build_steps.extend([ - # compile - {'name': image, - 'env' : env, - 'args': [ - 'bash', - '-c', - 'cd /src/{1} && mkdir -p {0} && compile'.format(out, name), + env.append('OUT=' + out) + + build_steps.extend([ + # compile + {'name': image, + 'env' : env, + 'args': [ + 'bash', + '-c', + 'cd /src/{1} && mkdir -p {0} && compile'.format(out, name), + ], + }, + # zip binaries + {'name': image, + 'args': [ + 'bash', + '-c', + 'cd {0} && zip -r {1} *'.format(out, zip_file) ], }, - # zip binaries - {'name': image, - 'args': [ - 'bash', - '-c', - 'cd {0} && zip -r {1} *'.format(out, zip_file) - ], - }, - # upload binaries - {'name': 'gcr.io/clusterfuzz-external/uploader', - 'args': [ - os.path.join(out, zip_file), - upload_url, - ], - }, - # upload srcmap - {'name': 'gcr.io/clusterfuzz-external/uploader', - 'args': [ - '/workspace/srcmap.json', - srcmap_url, - ], - }, - # cleanup - {'name': image, - 'args': [ - 'bash', - '-c', - 'rm -r ' + out, - ], - }, - ]) + # upload binaries + {'name': 'gcr.io/clusterfuzz-external/uploader', + 'args': [ + os.path.join(out, zip_file), + upload_url, + ], + }, + # upload srcmap + {'name': 'gcr.io/clusterfuzz-external/uploader', + 'args': [ + '/workspace/srcmap.json', + srcmap_url, + ], + }, + # cleanup + {'name': image, + 'args': [ + 'bash', + '-c', + 'rm -r ' + out, + ], + }, + ]) return build_steps