You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
1.7 KiB
57 lines
1.7 KiB
# 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__))
|
|
|