1*c8dee2aaSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*c8dee2aaSAndroid Build Coastguard Worker# 3*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2021 Google LLC 4*c8dee2aaSAndroid Build Coastguard Worker# 5*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 6*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file. 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker# This tool updates the OSS-Fuzz corpus using Google Cloud's 'gsutil' tool. 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker# You will need to be given access to the Google Storage fuzzer repo (at 11*c8dee2aaSAndroid Build Coastguard Worker# gs://skia-fuzzer/oss-fuzz/) by the Skia Infra team. 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker# You will also need to set up credentials for gsutil on your machine by running: 14*c8dee2aaSAndroid Build Coastguard Worker# gcloud auth login 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Workerimport os 17*c8dee2aaSAndroid Build Coastguard Workerimport subprocess 18*c8dee2aaSAndroid Build Coastguard Workerimport tempfile 19*c8dee2aaSAndroid Build Coastguard Workerimport zipfile 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker# Locate this script in the file system. 22*c8dee2aaSAndroid Build Coastguard WorkerstartDir = os.path.dirname(os.path.abspath(__file__)) 23*c8dee2aaSAndroid Build Coastguard WorkerfileNum = 1 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker# Prepare two scratch zip files, one for the input data as-is and another with 256-byte padding. 26*c8dee2aaSAndroid Build Coastguard Workerwith tempfile.NamedTemporaryFile(suffix='primary.zip', delete=False, mode='w') as pathToZip: 27*c8dee2aaSAndroid Build Coastguard Worker with zipfile.ZipFile(pathToZip.name, 'w', zipfile.ZIP_DEFLATED) as archive: 28*c8dee2aaSAndroid Build Coastguard Worker # Iterate over every file in this directory and use it to assemble our corpus. 29*c8dee2aaSAndroid Build Coastguard Worker for root, dirs, files in os.walk(startDir): 30*c8dee2aaSAndroid Build Coastguard Worker for file in files: 31*c8dee2aaSAndroid Build Coastguard Worker # Exclude files that won't be useful fuzzer inputs. 32*c8dee2aaSAndroid Build Coastguard Worker if (not file.startswith('.') # Hidden 33*c8dee2aaSAndroid Build Coastguard Worker and not file.endswith('.py') # Python 34*c8dee2aaSAndroid Build Coastguard Worker and not file.endswith('.test') # ES2 conformance script 35*c8dee2aaSAndroid Build Coastguard Worker and not file.endswith('.txt')): # Text 36*c8dee2aaSAndroid Build Coastguard Worker # Prepend a number to each output filename to guarantee uniqueness. 37*c8dee2aaSAndroid Build Coastguard Worker pathInZip = '%d_%s' % (fileNum, file) 38*c8dee2aaSAndroid Build Coastguard Worker fileNum += 1 39*c8dee2aaSAndroid Build Coastguard Worker with open('%s/%s' % (root, file), 'rb') as skslFile: 40*c8dee2aaSAndroid Build Coastguard Worker # Read the SkSL text as input. 41*c8dee2aaSAndroid Build Coastguard Worker inputSkSL = skslFile.read() 42*c8dee2aaSAndroid Build Coastguard Worker # Copy the SkSL into our zip archive. 43*c8dee2aaSAndroid Build Coastguard Worker archive.writestr(pathInZip, inputSkSL) 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker try: 46*c8dee2aaSAndroid Build Coastguard Worker # Upload our zip file to cloud storage. 47*c8dee2aaSAndroid Build Coastguard Worker output = subprocess.check_output( 48*c8dee2aaSAndroid Build Coastguard Worker ['gsutil', 'cp', pathToZip.name, 49*c8dee2aaSAndroid Build Coastguard Worker 'gs://skia-fuzzer/oss-fuzz/sksl_seed_corpus.zip'], 50*c8dee2aaSAndroid Build Coastguard Worker stderr=subprocess.STDOUT) 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker # Make the uploaded file world-readable. 53*c8dee2aaSAndroid Build Coastguard Worker output = subprocess.check_output( 54*c8dee2aaSAndroid Build Coastguard Worker ['gsutil', 'acl', 'ch', '-u', 'AllUsers:R', 55*c8dee2aaSAndroid Build Coastguard Worker 'gs://skia-fuzzer/oss-fuzz/sksl_seed_corpus.zip'], 56*c8dee2aaSAndroid Build Coastguard Worker stderr=subprocess.STDOUT) 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker except subprocess.CalledProcessError as err: 59*c8dee2aaSAndroid Build Coastguard Worker # Report the error. 60*c8dee2aaSAndroid Build Coastguard Worker print("### Unable to upload fuzzer corpus to Google Cloud:") 61*c8dee2aaSAndroid Build Coastguard Worker print(" " + "\n ".join(err.output.splitlines())) 62*c8dee2aaSAndroid Build Coastguard Worker print("\nPlease read the notes at the top of update_fuzzer.py for next steps.\n") 63*c8dee2aaSAndroid Build Coastguard Worker sys.exit(err.returncode) 64