2018-12-12 04:22:16 +01:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
|
|
import os, re
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
|
2018-12-12 20:34:44 +01:00
|
|
|
def noprefix(tag):
|
|
|
|
|
n = tag.find('.')
|
|
|
|
|
assert n > 0
|
|
|
|
|
return tag[n + 1:]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def getprefix(tag):
|
|
|
|
|
n = tag.find('.')
|
|
|
|
|
assert n > 0
|
|
|
|
|
return tag[0:n]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def load_pipfile(pipfile):
|
|
|
|
|
'''Returns a set of tags containing real tile type prefixes (ex: INT_L)'''
|
2018-12-12 04:22:16 +01:00
|
|
|
todos = set()
|
2018-12-12 20:34:44 +01:00
|
|
|
tile_type = None
|
2018-12-12 04:22:16 +01:00
|
|
|
with open(pipfile, "r") as f:
|
2018-12-12 20:34:44 +01:00
|
|
|
# INT_L.WW2BEG0.SR1BEG_S0
|
2018-12-12 04:22:16 +01:00
|
|
|
for line in f:
|
|
|
|
|
line = line.split()
|
2018-12-12 20:34:44 +01:00
|
|
|
tag = line[0]
|
|
|
|
|
prefix_line = getprefix(tag)
|
|
|
|
|
if tile_type is None:
|
|
|
|
|
tile_type = prefix_line
|
|
|
|
|
else:
|
|
|
|
|
assert tile_type == prefix_line
|
|
|
|
|
todos.add(tag)
|
|
|
|
|
return todos, tile_type
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def maketodo(pipfile, dbfile, intre, not_endswith=None, verbose=False):
|
|
|
|
|
'''
|
|
|
|
|
db files start with INT., but pipfile lines start with INT_L
|
|
|
|
|
Normalize by removing before the first dot
|
|
|
|
|
050-intpips doesn't care about contents, but most fuzzers use the tile type prefix
|
|
|
|
|
'''
|
|
|
|
|
|
|
|
|
|
todos, tile_type = load_pipfile(pipfile)
|
|
|
|
|
verbose and print('%s: %u entries' % (pipfile, len(todos)))
|
|
|
|
|
verbose and print("pipfile todo sample: %s" % list(todos)[0])
|
|
|
|
|
|
2018-12-12 04:22:16 +01:00
|
|
|
# Allow against empty db
|
|
|
|
|
if os.path.exists(dbfile):
|
2018-12-12 20:34:44 +01:00
|
|
|
verbose and print("Loading %s" % dbfile)
|
2018-12-12 04:22:16 +01:00
|
|
|
with open(dbfile, "r") as f:
|
2018-12-12 20:34:44 +01:00
|
|
|
# INT.BYP_ALT0.BYP_BOUNCE_N3_3 !22_07 !23_07 !25_07 21_07 24_07
|
2018-12-12 04:22:16 +01:00
|
|
|
for line in f:
|
|
|
|
|
line = line.split()
|
2018-12-12 20:34:44 +01:00
|
|
|
tag = tile_type + '.' + noprefix(line[0])
|
2018-12-12 06:13:10 +01:00
|
|
|
# bipips works on a subset
|
2018-12-12 20:34:44 +01:00
|
|
|
if tag in todos:
|
|
|
|
|
todos.remove(tag)
|
|
|
|
|
else:
|
|
|
|
|
verbose and print(
|
|
|
|
|
"WARNING: couldnt remove %s (line %s)" % (tag, line))
|
|
|
|
|
else:
|
|
|
|
|
verbose and print("WARNING: dbfile doesnt exist: %s" % dbfile)
|
|
|
|
|
verbose and print('Remove %s: %u entries' % (dbfile, len(todos)))
|
2018-12-12 04:22:16 +01:00
|
|
|
drops = 0
|
|
|
|
|
lines = 0
|
|
|
|
|
for line in todos:
|
|
|
|
|
if re.match(intre, line) and (not_endswith is None
|
|
|
|
|
or not line.endswith(not_endswith)):
|
|
|
|
|
print(line)
|
|
|
|
|
else:
|
|
|
|
|
drops += 1
|
|
|
|
|
lines += 1
|
2018-12-12 20:34:44 +01:00
|
|
|
verbose and print('Print %u entries w/ %u drops' % (lines, drops))
|
2018-12-12 04:22:16 +01:00
|
|
|
|
|
|
|
|
|
2018-12-12 06:13:10 +01:00
|
|
|
def run(build_dir, db_dir, intre, pip_type, not_endswith=None, verbose=False):
|
2018-12-12 04:22:16 +01:00
|
|
|
if db_dir is None:
|
|
|
|
|
db_dir = "%s/%s" % (
|
|
|
|
|
os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"))
|
|
|
|
|
|
|
|
|
|
assert intre, "RE is required"
|
|
|
|
|
maketodo(
|
2018-12-12 06:13:10 +01:00
|
|
|
"%s/%s_l.txt" % (build_dir, pip_type),
|
2018-12-12 04:22:16 +01:00
|
|
|
"%s/segbits_int_l.db" % db_dir,
|
|
|
|
|
intre,
|
|
|
|
|
not_endswith,
|
|
|
|
|
verbose=verbose)
|
|
|
|
|
maketodo(
|
2018-12-12 06:13:10 +01:00
|
|
|
"%s/%s_r.txt" % (build_dir, pip_type),
|
2018-12-12 04:22:16 +01:00
|
|
|
"%s/segbits_int_r.db" % db_dir,
|
|
|
|
|
intre,
|
|
|
|
|
not_endswith,
|
|
|
|
|
verbose=verbose)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
import argparse
|
|
|
|
|
|
|
|
|
|
parser = argparse.ArgumentParser(
|
|
|
|
|
description="Print list of known but unsolved PIPs")
|
|
|
|
|
|
2018-12-12 20:34:44 +01:00
|
|
|
parser.add_argument('--verbose', action='store_true', help='')
|
2018-12-12 04:22:16 +01:00
|
|
|
parser.add_argument('--build-dir', default="build", help='')
|
|
|
|
|
parser.add_argument('--db-dir', default=None, help='')
|
|
|
|
|
parser.add_argument('--re', required=True, help='')
|
2018-12-12 06:13:10 +01:00
|
|
|
parser.add_argument('--pip-type', default="pips_int", help='')
|
2018-12-12 04:22:16 +01:00
|
|
|
parser.add_argument(
|
|
|
|
|
'--not-endswith', help='Drop lines if they end with this')
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
|
|
|
|
run(
|
|
|
|
|
build_dir=args.build_dir,
|
|
|
|
|
db_dir=args.db_dir,
|
|
|
|
|
intre=args.re,
|
2018-12-12 06:13:10 +01:00
|
|
|
pip_type=args.pip_type,
|
2018-12-12 20:34:44 +01:00
|
|
|
not_endswith=args.not_endswith,
|
|
|
|
|
verbose=args.verbose)
|
2018-12-12 04:22:16 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
main()
|