Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork966
Expand file tree
/
Copy pathutils.py
More file actions
122 lines (100 loc) · 4.69 KB
/
utils.py
File metadata and controls
122 lines (100 loc) · 4.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
importatheris# pragma: no cover
importos# pragma: no cover
importre# pragma: no cover
importtraceback# pragma: no cover
importsys# pragma: no cover
fromtypingimportSet,Tuple,List# pragma: no cover
@atheris.instrument_func
defis_expected_exception_message(exception:Exception,error_message_list:List[str])->bool:# pragma: no cover
"""
Checks if the message of a given exception matches any of the expected error messages, case-insensitively.
Args:
exception (Exception): The exception object raised during execution.
error_message_list (List[str]): A list of error message substrings to check against the exception's message.
Returns:
bool: True if the exception's message contains any of the substrings from the error_message_list,
case-insensitively, otherwise False.
"""
exception_message=str(exception).lower()
forerrorinerror_message_list:
iferror.lower()inexception_message:
returnTrue
returnFalse
@atheris.instrument_func
defget_max_filename_length(path:str)->int:# pragma: no cover
"""
Get the maximum filename length for the filesystem containing the given path.
Args:
path (str): The path to check the filesystem for.
Returns:
int: The maximum filename length.
"""
returnos.pathconf(path,"PC_NAME_MAX")
@atheris.instrument_func
defread_lines_from_file(file_path:str)->list:
"""Read lines from a file and return them as a list."""
try:
withopen(file_path,"r")asf:
return [line.strip()forlineinfifline.strip()]
exceptFileNotFoundError:
print(f"File not found:{file_path}")
return []
exceptIOErrorase:
print(f"Error reading file{file_path}:{e}")
return []
@atheris.instrument_func
defload_exception_list(file_path:str="explicit-exceptions-list.txt")->Set[Tuple[str,str]]:
"""Load and parse the exception list from a default or specified file."""
try:
bundle_dir=os.path.dirname(os.path.abspath(__file__))
full_path=os.path.join(bundle_dir,file_path)
lines=read_lines_from_file(full_path)
exception_list:Set[Tuple[str,str]]=set()
forlineinlines:
match=re.match(r"(.+):(\d+):",line)
ifmatch:
file_path:str=match.group(1).strip()
line_number:str=str(match.group(2).strip())
exception_list.add((file_path,line_number))
returnexception_list
exceptExceptionase:
print(f"Error loading exception list:{e}")
returnset()
@atheris.instrument_func
defmatch_exception_with_traceback(exception_list:Set[Tuple[str,str]],exc_traceback)->bool:
"""Match exception traceback with the entries in the exception list."""
forfilename,lineno,_,_intraceback.extract_tb(exc_traceback):
forfile_pattern,line_patterninexception_list:
# Ensure filename and line_number are strings for regex matching
ifre.fullmatch(file_pattern,filename)andre.fullmatch(line_pattern,str(lineno)):
returnTrue
returnFalse
@atheris.instrument_func
defcheck_exception_against_list(exc_traceback,exception_file:str="explicit-exceptions-list.txt")->bool:
"""Check if the exception traceback matches any entry in the exception list."""
exception_list=load_exception_list(exception_file)
returnmatch_exception_with_traceback(exception_list,exc_traceback)
@atheris.instrument_func
defhandle_exception(e:Exception)->int:
"""Encapsulate exception handling logic for reusability."""
exc_traceback=e.__traceback__
ifcheck_exception_against_list(exc_traceback):
return-1
else:
raisee
@atheris.instrument_func
defsetup_git_environment()->None:
"""Set up the environment variables for Git."""
bundle_dir=os.path.dirname(os.path.abspath(__file__))
ifgetattr(sys,"frozen",False)andhasattr(sys,"_MEIPASS"):# pragma: no cover
bundled_git_binary_path=os.path.join(bundle_dir,"git")
os.environ["GIT_PYTHON_GIT_EXECUTABLE"]=bundled_git_binary_path
ifnotsys.warnoptions:# pragma: no cover
# The warnings filter below can be overridden by passing the -W option
# to the Python interpreter command line or setting the `PYTHONWARNINGS` environment variable.
importwarnings
importlogging
# Fuzzing data causes some modules to generate a large number of warnings
# which are not usually interesting and make the test output hard to read, so we ignore them.
warnings.simplefilter("ignore")
logging.getLogger().setLevel(logging.ERROR)