blob: 12a9742970587a9eb39b2991ca7cdac81afb05ee [file] [log] [blame]
#!/usr/bin/env python3.8
# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import os
class Dictionary(object):
"""Represents the dictionary of keywords for a fuzzer.
See https://llvm.org/docs/LibFuzzer.html#dictionaries for details on
fuzzer dictionaries. Note that libFuzzer supports at most one"-dict=DICT"
option when being run.
Attributes:
fuzzer: The Fuzzer corresponding to this object.
ns: Alias for fuzzer.ns.
nspath: Path to dictionary in the namespace.
"""
def __init__(self, fuzzer):
self._fuzzer = fuzzer
self._nspath = None
@property
def fuzzer(self):
"""The Fuzzer corresponding to this object."""
return self._fuzzer
@property
def host(self):
"""Alias for fuzzer.host."""
return self.fuzzer.host
@property
def ns(self):
"""Alias for fuzzer.ns."""
return self.fuzzer.ns
@property
def nspath(self):
"""Path to dictionary in the namespace."""
if not self._nspath:
self.find_on_device()
return self._nspath
def find_on_device(self):
resource = self.ns.resource(self.fuzzer.executable + '/dictionary')
if self.ns.ls(resource):
self._nspath = resource
def replace(self, pathname):
if not self.host.isfile(pathname):
self.host.error('No such file: {}'.format(pathname))
relpath = os.path.basename(pathname)
self._nspath = self.ns.data(relpath)
self.ns.store(self._nspath, pathname)