# Copyright 2018 The Chromium OS 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 import glob import re # Matching a string of length m in an NFA of size n is O(mn^2), but the # performance also depends largely on the implementation. It appears to be fast # enough according to the tests. # # The performance bottleneck of this script is readelf. Unless this becomes # slower than readelf, don't waste time here. def is_whitelisted(list_name, pattern): """chech whether the given pattern is specified in the whitelist. Args: list_name: name of the whitelist pattern: the target string Returns: True if matched otherwise False """ return pattern and whitelists[list_name].match(pattern) def prepare_whitelist(patterns): """Join and compile the re patterns. Args: patterns: regex patterns. Return: A compiled re object """ return re.compile('|'.join(patterns)) def load_whitelists(dirname): """Load whitelists under dirname. A whitelist ends with .whitelist. Args: dirname: path to the dir. Returns: A dictionary of 'filename' -> whitelist matcher. """ wlist = {} for fn in glob.glob(os.path.join(dirname, '*.whitelist')): key = os.path.splitext(os.path.basename(fn))[0] with open(fn, 'r') as f: patterns = f.read().splitlines() patterns = [l for l in patterns if l != ''] patterns = [l for l in patterns if l[0] != '#'] wlist[key] = prepare_whitelist(patterns) return wlist whitelists = load_whitelists(os.path.dirname(__file__))