Hello,

On 27/01/2021 17:03:53+0800, Lee Chee Yang wrote:
> From: Lee Chee Yang <chee.yang....@intel.com>
> 
> add CVE_VERSION_SUFFIX to indicate the version suffix type, currently
> works in two value, "alphabetical" if the version string uses single
> alphabetical character suffix as incremental release, blank to not
> consider the unidentified suffixes. This can be expand when more suffix
> pattern identified.
> 
> refactor cve_check.Version class to use functools add parameter to handle
> suffix condition.
> 
> Also update testcases to cover new changes.
> 
> Signed-off-by: Lee Chee Yang <chee.yang....@intel.com>
> ---
>  meta/classes/cve-check.bbclass            | 12 ++++---
>  meta/lib/oe/cve_check.py                  | 40 ++++++++++++-----------
>  meta/lib/oeqa/selftest/cases/cve_check.py | 11 ++++++-
>  3 files changed, 39 insertions(+), 24 deletions(-)
> 

I believe this patch resulted in the following autobuilder errors:

https://autobuilder.yoctoproject.org/typhoon/#/builders/79/builds/1768/steps/14/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/80/builds/1752/steps/15/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/86/builds/1757/steps/14/logs/stdio
https://autobuilder.yoctoproject.org/typhoon/#/builders/87/builds/1784/steps/14/logs/stdio

2021-01-28 00:16:31,719 - oe-selftest - INFO - 
cve_check.CVECheck.test_version_compare (subunit.RemotedTestCase)
2021-01-28 00:16:31,720 - oe-selftest - INFO -  ... FAIL
2021-01-28 00:16:31,720 - oe-selftest - INFO - 11: 1/17 2/424 (0.14s) 
(cve_check.CVECheck.test_version_compare)
2021-01-28 00:16:31,720 - oe-selftest - INFO - 
testtools.testresult.real._StringException: Traceback (most recent call last):
  File 
"/home/pokybuild/yocto-worker/oe-selftest-centos/build/meta/lib/oeqa/selftest/cases/cve_check.py",
 line 36, in test_version_compare
    self.assertTrue( result ,msg="Failed to compare version with suffix '1.0b' 
> '1.0'")
  File "/usr/lib64/python3.6/unittest/case.py", line 699, in assertTrue
    raise self.failureException(msg)
AssertionError: False is not true : Failed to compare version with suffix 
'1.0b' > '1.0'



> diff --git a/meta/classes/cve-check.bbclass b/meta/classes/cve-check.bbclass
> index 646cc879dd..ed86403b6b 100644
> --- a/meta/classes/cve-check.bbclass
> +++ b/meta/classes/cve-check.bbclass
> @@ -53,6 +53,9 @@ CVE_CHECK_PN_WHITELIST ?= ""
>  #
>  CVE_CHECK_WHITELIST ?= ""
>  
> +# set to "alphabetical" for version using single alphabetical character as 
> increament release
> +CVE_VERSION_SUFFIX ??= ""
> +
>  python cve_save_summary_handler () {
>      import shutil
>      import datetime
> @@ -210,6 +213,7 @@ def check_cves(d, patched_cves):
>  
>      pn = d.getVar("PN")
>      real_pv = d.getVar("PV")
> +    suffix = d.getVar("CVE_VERSION_SUFFIX")
>  
>      cves_unpatched = []
>      # CVE_PRODUCT can contain more than one product (eg. curl/libcurl)
> @@ -263,8 +267,8 @@ def check_cves(d, patched_cves):
>                  else:
>                      if operator_start:
>                          try:
> -                            vulnerable_start =  (operator_start == '>=' and 
> Version(pv) >= Version(version_start))
> -                            vulnerable_start |= (operator_start == '>' and 
> Version(pv) > Version(version_start))
> +                            vulnerable_start =  (operator_start == '>=' and 
> Version(pv,suffix) >= Version(version_start,suffix))
> +                            vulnerable_start |= (operator_start == '>' and 
> Version(pv,suffix) > Version(version_start,suffix))
>                          except:
>                              bb.warn("%s: Failed to compare %s %s %s for %s" %
>                                      (product, pv, operator_start, 
> version_start, cve))
> @@ -274,8 +278,8 @@ def check_cves(d, patched_cves):
>  
>                      if operator_end:
>                          try:
> -                            vulnerable_end  = (operator_end == '<=' and 
> Version(pv) <= Version(version_end) )
> -                            vulnerable_end |= (operator_end == '<' and 
> Version(pv) < Version(version_end) )
> +                            vulnerable_end  = (operator_end == '<=' and 
> Version(pv,suffix) <= Version(version_end,suffix) )
> +                            vulnerable_end |= (operator_end == '<' and 
> Version(pv,suffix) < Version(version_end,suffix) )
>                          except:
>                              bb.warn("%s: Failed to compare %s %s %s for %s" %
>                                      (product, pv, operator_end, version_end, 
> cve))
> diff --git a/meta/lib/oe/cve_check.py b/meta/lib/oe/cve_check.py
> index ec48a3f829..e40929fd2b 100644
> --- a/meta/lib/oe/cve_check.py
> +++ b/meta/lib/oe/cve_check.py
> @@ -1,58 +1,60 @@
>  import collections
>  import re
>  import itertools
> +import functools
>  
>  _Version = collections.namedtuple(
> -    "_Version", ["release", "pre_l", "pre_v"]
> +    "_Version", ["release", "patch_l", "pre_l", "pre_v"]
>  )
>  
> +@functools.total_ordering
>  class Version():
> -    _version_pattern =  
> r"""v?(?:(?P<release>[0-9]+(?:[-\.][0-9]+)*)(?P<pre>[-_\.]?(?P<pre_l>(rc|alpha|beta|pre|preview|dev))[-_\.]?(?P<pre_v>[0-9]+)?)?)(.*)?"""
> -    _regex = re.compile(r"^\s*" + _version_pattern + r"\s*$", re.VERBOSE | 
> re.IGNORECASE)
> -    def __init__(self, version):
> -        match = self._regex.search(version)
> +
> +    def __init__(self, version, suffix=None):
> +        if suffix == "alphabetical":
> +            version_pattern =  
> r"""r?v?(?:(?P<release>[0-9]+(?:[-\.][0-9]+)*)(?P<patch>[-_\.]?(?P<patch_l>[a-z]))?(?P<pre>[-_\.]?(?P<pre_l>(rc|alpha|beta|pre|preview|dev))[-_\.]?(?P<pre_v>[0-9]+)?)?)(.*)?"""
> +        else:
> +            version_pattern =  
> r"""r?v?(?:(?P<release>[0-9]+(?:[-\.][0-9]+)*)(?P<pre>[-_\.]?(?P<pre_l>(rc|alpha|beta|pre|preview|dev))[-_\.]?(?P<pre_v>[0-9]+)?)?)(.*)?"""
> +        regex = re.compile(r"^\s*" + version_pattern + r"\s*$", re.VERBOSE | 
> re.IGNORECASE)
> +
> +        match = regex.search(version)
>          if not match:
>              raise Exception("Invalid version: '{0}'".format(version))
>  
>          self._version = _Version(
>              release=tuple(int(i) for i in 
> match.group("release").replace("-",".").split(".")),
> +            patch_l=str(match.group("patch_l")) if suffix == "alphabetical" 
> else "",
>              pre_l=match.group("pre_l"),
>              pre_v=match.group("pre_v")
>          )
>  
>          self._key = _cmpkey(
>              self._version.release,
> +            self._version.patch_l,
>              self._version.pre_l,
>              self._version.pre_v
>          )
>  
> -    def __le__(self, other):
> -        if not isinstance(other, Version):
> -            return NotImplemented
> -        return self._key <= other._key
> -
> -    def __lt__(self, other):
> +    def __eq__(self, other):
>          if not isinstance(other, Version):
>              return NotImplemented
> -        return self._key < other._key
> -
> -    def __ge__(self, other):
> -        if not isinstance(other, Version):
> -            return NotImplemented
> -        return self._key >= other._key
> +        return self._key == other._key
>  
>      def __gt__(self, other):
>          if not isinstance(other, Version):
>              return NotImplemented
>          return self._key > other._key
>  
> -def _cmpkey(release, pre_l, pre_v):
> +def _cmpkey(release, patch_l, pre_l, pre_v):
>      # remove leading 0
>      _release = tuple(
>          reversed(list(itertools.dropwhile(lambda x: x == 0, 
> reversed(release))))
>      )
> +
> +    _patch = patch_l.upper()
> +
>      if pre_l is None and pre_v is None:
>          _pre = float('inf')
>      else:
>          _pre = float(pre_v) if pre_v else float('-inf')
> -    return _release, _pre
> +    return _release, _patch, _pre
> diff --git a/meta/lib/oeqa/selftest/cases/cve_check.py 
> b/meta/lib/oeqa/selftest/cases/cve_check.py
> index 35e2b29a9a..3f343a2841 100644
> --- a/meta/lib/oeqa/selftest/cases/cve_check.py
> +++ b/meta/lib/oeqa/selftest/cases/cve_check.py
> @@ -23,5 +23,14 @@ class CVECheck(OESelftestTestCase):
>          self.assertTrue( result, msg="Failed to compare version '1.0_dev' <= 
> '1.0'")
>  
>          # ignore "p1" and "p2", so these should be equal
> -        result = Version("1.0p2") <= Version("1.0p1") and Version("1.0p2") 
> >= Version("1.0p1")
> +        result = Version("1.0p2") == Version("1.0p1")
>          self.assertTrue( result ,msg="Failed to compare version '1.0p2' to 
> '1.0p1'")
> +        # ignore the "b" and "r"
> +        result = Version("1.0b") == Version("1.0r")
> +        self.assertTrue( result ,msg="Failed to compare version '1.0b' to 
> '1.0r'")
> +
> +        # consider the trailing alphabet as patched level when comparing
> +        result = Version("1.0b","alphabetical") < 
> Version("1.0r","alphabetical")
> +        self.assertTrue( result ,msg="Failed to compare version with suffix 
> '1.0b' < '1.0r'")
> +        result = Version("1.0b","alphabetical") > 
> Version("1.0","alphabetical")
> +        self.assertTrue( result ,msg="Failed to compare version with suffix 
> '1.0b' > '1.0'")
> -- 
> 2.17.1
> 

> 
> 
> 


-- 
Alexandre Belloni, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#147392): 
https://lists.openembedded.org/g/openembedded-core/message/147392
Mute This Topic: https://lists.openembedded.org/mt/80153215/21656
Group Owner: openembedded-core+ow...@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to