blob: f45330ff56a8aac4b1f3a646db345801140649b2 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Generational ClusterFuzz fuzzer. It generates IPC messages using
GenerateTraits. Support of GenerateTraits for different types will be gradually
added.
"""
import argparse
import os
import random
import string
import subprocess
import sys
import tempfile
import time
# Number of IPC messages per ipcdump
NUM_IPC_MESSAGES = 1500
def random_id(size=16, chars=string.ascii_lowercase):
return ''.join(random.choice(chars) for x in range(size))
def random_ipcdump_path(ipcdump_dir):
return os.path.join(ipcdump_dir, 'fuzz-' + random_id() + '.ipcdump')
class GenerationalFuzzer:
def parse_cf_args(self):
parser = argparse.ArgumentParser()
parser.add_argument('--input_dir')
parser.add_argument('--output_dir')
parser.add_argument('--no_of_files', type=int)
self.args = args = parser.parse_args();
if not args.input_dir or not args.output_dir or not args.no_of_files:
parser.print_help()
sys.exit(1)
def get_paths(self):
app_path_key = 'APP_PATH'
self.util_binary = 'ipc_message_util'
self.generate_binary = 'ipc_fuzzer_generate'
if app_path_key not in os.environ:
sys.exit('Env var %s should be set to chrome path' % app_path_key)
chrome_path = os.environ[app_path_key]
out_dir = os.path.dirname(chrome_path)
self.util_path = os.path.join(out_dir, self.util_binary)
self.generate_path = os.path.join(out_dir, self.generate_binary)
def generate_ipcdump(self):
generated_ipcdump = random_ipcdump_path(self.args.output_dir)
cmd = [self.generate_path,
'--count=' + str(NUM_IPC_MESSAGES),
generated_ipcdump]
if subprocess.call(cmd):
sys.exit('%s failed' % self.generate_binary)
def main(self):
self.parse_cf_args()
self.get_paths()
for i in xrange(self.args.no_of_files):
self.generate_ipcdump()
return 0
if __name__ == "__main__":
fuzzer = GenerationalFuzzer()
sys.exit(fuzzer.main())