From 139d44a31cd5d7874283b6b2b4da734e6556c6c8 Mon Sep 17 00:00:00 2001 From: Mathieu Courtois <mathieu.courtois@edf.fr> Date: Thu, 22 Nov 2018 17:35:53 +0100 Subject: [PATCH] [#28192] Ensure that FilenameCat checkers are working on files before opening them. --HG-- branch : edf/mc --- lib/aslint/base_checkers.py | 13 +++++++++++-- lib/aslint/common_checkers.py | 7 +++++-- lib/aslint/other/cxx_checkers.py | 3 ++- lib/aslint/python/python_checkers.py | 2 +- lib/aslint/test/test_checkers.py | 16 +++++++++++++--- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/lib/aslint/base_checkers.py b/lib/aslint/base_checkers.py index 873cf50f..881589a1 100644 --- a/lib/aslint/base_checkers.py +++ b/lib/aslint/base_checkers.py @@ -417,8 +417,17 @@ def checkers_from_context(dict_objects, typm): return msg -def search_msg(expr): - """Convenient wrapper to search 'expr' with relevant re flags.""" +def search_msg(expr, ignore_case=True): + """Convenient wrapper to search 'expr' with relevant re flags. + + Arguments: + expr (str): Regular expression to search. + ignore_case (bool, optional): If *True* (the default) a case-insensitive + search is performed. + """ + flag = re.M + if ignore_case: + flag |= re.I return re.compile(expr, re.M | re.I).finditer # categories of checkers to filter checklist diff --git a/lib/aslint/common_checkers.py b/lib/aslint/common_checkers.py index db7534db..c2695990 100644 --- a/lib/aslint/common_checkers.py +++ b/lib/aslint/common_checkers.py @@ -5,6 +5,7 @@ They may be included together using CHECK_LIST or individually.""" import os +import os.path as osp import stat import re import time @@ -50,10 +51,12 @@ class IncorrectPermission(FilenameCat, GenericMsg): def search(self, fname): """Check for file mode""" result = [] + if not osp.isfile(fname): + return [] if set([re.search(expr, fname) for expr in SCRIPTS]) != set([None]): return result mode = os.stat(fname).st_mode - if mode & self._req != self._req or mode & (self._bad) != 0: + if mode & self._req != self._req or mode & self._bad != 0: result.append(' not %s' % (oct(mode)[-3:])) return result @@ -153,7 +156,7 @@ class InvalidEncoding(FilenameCat, GenericMsg): def search(self, fname): """Check for file encoding""" result = [] - if fname == "waf.engine" or is_binary(fname): + if not osp.isfile(fname) or fname == "waf.engine" or is_binary(fname): return result if not check_encoding(open(fname, 'rb').read(), 'utf-8'): result.append('') diff --git a/lib/aslint/other/cxx_checkers.py b/lib/aslint/other/cxx_checkers.py index b88f9d3a..29adfb75 100644 --- a/lib/aslint/other/cxx_checkers.py +++ b/lib/aslint/other/cxx_checkers.py @@ -2,6 +2,7 @@ """Checkers for CXX source files""" +import os.path as osp import re import aslint.common_checkers as COMM @@ -23,7 +24,7 @@ class MissingConstructor(FilenameCat, GenericMsg): def search(self, filename): """Check that at least two constructors exist for each class.""" error = [] - if not filename.endswith("Interface.cxx"): + if not filename.endswith("Interface.cxx") or not osp.isfile(filename): return error with open(filename, "r") as fobj: diff --git a/lib/aslint/python/python_checkers.py b/lib/aslint/python/python_checkers.py index 37ba0f17..ee612b58 100644 --- a/lib/aslint/python/python_checkers.py +++ b/lib/aslint/python/python_checkers.py @@ -65,7 +65,7 @@ class ExecUsed(FileContentCat, TextMsg): """Using 'exec()' is discouraged""" id = "C4007" - search = search_msg(r"\b(?P<main>exec *\(.*)") + search = search_msg(r"\b(?P<main>exec *\(.*)", ignore_case=False) CHECK_LIST = checkers_from_context(globals(), TextMsg) diff --git a/lib/aslint/test/test_checkers.py b/lib/aslint/test/test_checkers.py index e2bd9db2..723b244a 100644 --- a/lib/aslint/test/test_checkers.py +++ b/lib/aslint/test/test_checkers.py @@ -21,14 +21,20 @@ REG_EXT = ("com[m0-9]", "py", "data", "datg", "export", "[0-9]{1,2}", "mail", "mgib", "med", "mmed", "msh", "msup", "mfront") -class UnsupportedExtension(FilenameCat, TextMsgNotFound): +class UnsupportedExtension(FilenameCat, TextMsg): """Unsupported extension Only these extensions are allowed for testcases: .comm, .com[0-9], .py, .data, .datg, .export, .mail, .mgib, .mmed, .msh, .msup, .[0-9]+""" id = "C9002" fmt = "%(id)s: %(label)s" - search = search_msg(r"(?P<ext>\.(" + "|".join(REG_EXT) + "))$") + _search = search_msg(r"(?P<ext>\.(" + "|".join(REG_EXT) + "))$") + + def search(self, fname): + """Check for unsupported extension.""" + if not osp.isfile(fname) or self._search(fname): + return [] + return [fname] class InvalidFilename(FilenameCat, TextMsgNotFound): @@ -111,7 +117,7 @@ class InvalidFilenameXX(FilenameCat, TextMsgNotFound): r"_\w{1,16})" r"(?P<ext>\.(comm|py))$") _expr3 = re.compile(r"/(?P<root>xx\w+)" - r"(?P<ext>\.(export|py))$") + r"(?P<ext>(|\.(export|py)))$") _expr4 = re.compile(r"/(?P<root>[0-9]+)" r"(?P<ext>\.med)$") found = (_expr1.findall(txt) or @@ -207,6 +213,8 @@ class DatafileTooBig(FilenameCat, GenericMsg): def search(self, txt): """Check size of files""" + if not osp.isfile(txt): + return [] check_asrun() from asrun.profil import AsterProfil if osp.basename(txt) in ['perf011a.export', 'perf011b.export']: @@ -370,6 +378,8 @@ class ResourcesTooBig(FilenameCat, GenericMsg): def search(self, txt): """Check a .export""" + if not osp.isfile(txt): + return [] check_asrun() from asrun.profil import AsterProfil pexp = AsterProfil(txt) -- GitLab