This was now merged to dunfell branch and it doesn't apply cleanly:

WARNING: opencv-4.1.0-r0 do_patch: Fuzz detected:

Applying patch CVE-2019-14491.patch
patching file modules/objdetect/src/cascadedetect.cpp
Hunk #1 succeeded at 46 with fuzz 1 (offset -1 lines).
Hunk #2 succeeded at 540 (offset -1 lines).
Hunk #3 succeeded at 552 (offset -1 lines).
Hunk #4 succeeded at 613 (offset -1 lines).
Hunk #5 succeeded at 774 (offset -1 lines).
Hunk #6 succeeded at 825 (offset -1 lines).
Hunk #7 succeeded at 1470 (offset -36 lines).
patching file modules/objdetect/src/cascadedetect.hpp

The context lines in the patches can be updated with devtool:

    devtool modify opencv
    devtool finish --force-patch-refresh opencv <layer_path>

Don't forget to review changes done by devtool!

WARNING: opencv-4.1.0-r0 do_patch: QA Issue: Patch log indicates that
patches do not apply cleanly. [patch-fuzz]

Can you please update the patches to apply cleanly?

On Tue, Mar 9, 2021 at 5:40 PM Neetika.Singh <[email protected]> wrote:

> From: Neetika Singh <[email protected]>
>
> Added patches to fix below CVE's:
>
> 1. CVE-2019-14491, CVE-2019-14492
> Link:
> https://github.com/opencv/opencv/commit/ac425f67e4c1d0da9afb9203f0918d8d57c067ed
>
> 2. CVE-2019-14493
> Link:
> https://github.com/opencv/opencv/commit/5691d998ead1d9b0542bcfced36c2dceb3a59023
>
> 3. CVE-2019-15939
> Link:
> https://github.com/opencv/opencv/commit/5a497077f109d543ab86dfdf8add1c76c0e47d29
>
> 4. CVE-2019-19624
> Link:
> https://github.com/opencv/opencv/commit/d1615ba11a93062b1429fce9f0f638d1572d3418
>
> Signed-off-by: Neetika.Singh <[email protected]>
> ---
>  .../opencv/opencv/CVE-2019-14491.patch             | 148 +++++++++++++
>  .../opencv/opencv/CVE-2019-14493.patch             | 237
> +++++++++++++++++++++
>  .../opencv/opencv/CVE-2019-15939.patch             |  73 +++++++
>  .../opencv/opencv/CVE-2019-19624.patch             | 157 ++++++++++++++
>  meta-oe/recipes-support/opencv/opencv_4.1.0.bb     |   4 +
>  5 files changed, 619 insertions(+)
>  create mode 100644
> meta-oe/recipes-support/opencv/opencv/CVE-2019-14491.patch
>  create mode 100644
> meta-oe/recipes-support/opencv/opencv/CVE-2019-14493.patch
>  create mode 100644
> meta-oe/recipes-support/opencv/opencv/CVE-2019-15939.patch
>  create mode 100644
> meta-oe/recipes-support/opencv/opencv/CVE-2019-19624.patch
>
> diff --git a/meta-oe/recipes-support/opencv/opencv/CVE-2019-14491.patch
> b/meta-oe/recipes-support/opencv/opencv/CVE-2019-14491.patch
> new file mode 100644
> index 0000000..b82bea5
> --- /dev/null
> +++ b/meta-oe/recipes-support/opencv/opencv/CVE-2019-14491.patch
> @@ -0,0 +1,148 @@
> +From 321c74ccd6077bdea1d47450ca4fe955cb5b6330 Mon Sep 17 00:00:00 2001
> +From: Alexander Alekhin <[email protected]>
> +Date: Thu, 25 Jul 2019 17:15:59 +0300
> +Subject: [PATCH] objdetect: validate feature rectangle on reading
> +
> +CVE: CVE-2019-14491
> +CVE: CVE-2019-14492
> +Upstream-Status: Backport [
> https://github.com/opencv/opencv/commit/ac425f67e4c1d0da9afb9203f0918d8d57c067ed.patch
> ]
> +Comment: No changes in any hunk
> +
> +Signed-off-by: Neetika Singh <[email protected]>
> +---
> + modules/objdetect/src/cascadedetect.cpp | 43 +++++++++++++++++++++----
> + modules/objdetect/src/cascadedetect.hpp |  6 ++--
> + 2 files changed, 40 insertions(+), 9 deletions(-)
> +
> +diff --git a/modules/objdetect/src/cascadedetect.cpp
> b/modules/objdetect/src/cascadedetect.cpp
> +index 4b2078306fe..bd62cd21a1b 100644
> +--- a/modules/objdetect/src/cascadedetect.cpp
> ++++ b/modules/objdetect/src/cascadedetect.cpp
> +@@ -47,6 +47,10 @@
> + #include "opencv2/objdetect/objdetect_c.h"
> + #include "opencl_kernels_objdetect.hpp"
> +
> ++#if defined(_MSC_VER)
> ++#  pragma warning(disable:4458)  // declaration of 'origWinSize' hides
> class member
> ++#endif
> ++
> + namespace cv
> + {
> +
> +@@ -537,7 +541,7 @@ bool FeatureEvaluator::setImage( InputArray _image,
> const std::vector<float>& _s
> +
> + //----------------------------------------------  HaarEvaluator
> ---------------------------------------
> +
> +-bool HaarEvaluator::Feature :: read( const FileNode& node )
> ++bool HaarEvaluator::Feature::read(const FileNode& node, const Size&
> origWinSize)
> + {
> +     FileNode rnode = node[CC_RECTS];
> +     FileNodeIterator it = rnode.begin(), it_end = rnode.end();
> +@@ -549,11 +553,23 @@ bool HaarEvaluator::Feature :: read( const
> FileNode& node )
> +         rect[ri].weight = 0.f;
> +     }
> +
> ++    const int W = origWinSize.width;
> ++    const int H = origWinSize.height;
> ++
> +     for(ri = 0; it != it_end; ++it, ri++)
> +     {
> +         FileNodeIterator it2 = (*it).begin();
> +-        it2 >> rect[ri].r.x >> rect[ri].r.y >>
> +-            rect[ri].r.width >> rect[ri].r.height >> rect[ri].weight;
> ++        Feature::RectWeigth& rw = rect[ri];
> ++        it2 >> rw.r.x >> rw.r.y >> rw.r.width >> rw.r.height >>
> rw.weight;
> ++        // input validation
> ++        {
> ++            CV_CheckGE(rw.r.x, 0, "Invalid HAAR feature");
> ++            CV_CheckGE(rw.r.y, 0, "Invalid HAAR feature");
> ++            CV_CheckLT(rw.r.x, W, "Invalid HAAR feature");  // necessary
> for overflow checks
> ++            CV_CheckLT(rw.r.y, H, "Invalid HAAR feature");  // necessary
> for overflow checks
> ++            CV_CheckLE(rw.r.x + rw.r.width, W, "Invalid HAAR feature");
> ++            CV_CheckLE(rw.r.y + rw.r.height, H, "Invalid HAAR feature");
> ++        }
> +     }
> +
> +     tilted = (int)node[CC_TILTED] != 0;
> +@@ -598,7 +614,7 @@ bool HaarEvaluator::read(const FileNode& node, Size
> _origWinSize)
> +
> +     for(i = 0; i < n; i++, ++it)
> +     {
> +-        if(!ff[i].read(*it))
> ++        if(!ff[i].read(*it, _origWinSize))
> +             return false;
> +         if( ff[i].tilted )
> +             hasTiltedFeatures = true;
> +@@ -759,11 +775,24 @@ int HaarEvaluator::getSquaresOffset() const
> + }
> +
> + //----------------------------------------------  LBPEvaluator
> -------------------------------------
> +-bool LBPEvaluator::Feature :: read(const FileNode& node )
> ++bool LBPEvaluator::Feature::read(const FileNode& node, const Size&
> origWinSize)
> + {
> +     FileNode rnode = node[CC_RECT];
> +     FileNodeIterator it = rnode.begin();
> +     it >> rect.x >> rect.y >> rect.width >> rect.height;
> ++
> ++    const int W = origWinSize.width;
> ++    const int H = origWinSize.height;
> ++    // input validation
> ++    {
> ++        CV_CheckGE(rect.x, 0, "Invalid LBP feature");
> ++        CV_CheckGE(rect.y, 0, "Invalid LBP feature");
> ++        CV_CheckLT(rect.x, W, "Invalid LBP feature");
> ++        CV_CheckLT(rect.y, H, "Invalid LBP feature");
> ++        CV_CheckLE(rect.x + rect.width, W, "Invalid LBP feature");
> ++        CV_CheckLE(rect.y + rect.height, H, "Invalid LBP feature");
> ++    }
> ++
> +     return true;
> + }
> +
> +@@ -797,7 +826,7 @@ bool LBPEvaluator::read( const FileNode& node, Size
> _origWinSize )
> +     std::vector<Feature>& ff = *features;
> +     for(int i = 0; it != it_end; ++it, i++)
> +     {
> +-        if(!ff[i].read(*it))
> ++        if(!ff[i].read(*it, _origWinSize))
> +             return false;
> +     }
> +     nchannels = 1;
> +@@ -1477,6 +1506,8 @@ bool CascadeClassifierImpl::Data::read(const
> FileNode &root)
> +     origWinSize.width = (int)root[CC_WIDTH];
> +     origWinSize.height = (int)root[CC_HEIGHT];
> +     CV_Assert( origWinSize.height > 0 && origWinSize.width > 0 );
> ++    CV_CheckLE(origWinSize.width, 1000000, "Invalid window size (too
> large)");
> ++    CV_CheckLE(origWinSize.height, 1000000, "Invalid window size (too
> large)");
> +
> +     // load feature params
> +     FileNode fn = root[CC_FEATURE_PARAMS];
> +diff --git a/modules/objdetect/src/cascadedetect.hpp
> b/modules/objdetect/src/cascadedetect.hpp
> +index f9910530b94..d9a288fcdda 100644
> +--- a/modules/objdetect/src/cascadedetect.hpp
> ++++ b/modules/objdetect/src/cascadedetect.hpp
> +@@ -317,12 +317,12 @@ class HaarEvaluator CV_FINAL : public
> FeatureEvaluator
> +     struct Feature
> +     {
> +         Feature();
> +-        bool read( const FileNode& node );
> ++        bool read(const FileNode& node, const Size& origWinSize);
> +
> +         bool tilted;
> +
> +         enum { RECT_NUM = 3 };
> +-        struct
> ++        struct RectWeigth
> +         {
> +             Rect r;
> +             float weight;
> +@@ -412,7 +412,7 @@ class LBPEvaluator CV_FINAL : public FeatureEvaluator
> +         Feature( int x, int y, int _block_w, int _block_h  ) :
> +                  rect(x, y, _block_w, _block_h) {}
> +
> +-        bool read(const FileNode& node );
> ++        bool read(const FileNode& node, const Size& origWinSize);
> +
> +         Rect rect; // weight and height for block
> +     };
> +
> diff --git a/meta-oe/recipes-support/opencv/opencv/CVE-2019-14493.patch
> b/meta-oe/recipes-support/opencv/opencv/CVE-2019-14493.patch
> new file mode 100644
> index 0000000..88d6a7f
> --- /dev/null
> +++ b/meta-oe/recipes-support/opencv/opencv/CVE-2019-14493.patch
> @@ -0,0 +1,237 @@
> +From 5691d998ead1d9b0542bcfced36c2dceb3a59023 Mon Sep 17 00:00:00 2001
> +From: Alexander Alekhin <[email protected]>
> +Date: Thu, 25 Jul 2019 15:14:22 +0300
> +Subject: [PATCH] core(persistence): added null ptr checks
> +
> +CVE: CVE-2019-14493
> +Upstream-Status: Backport [
> https://github.com/opencv/opencv/commit/5691d998ead1d9b0542bcfced36c2dceb3a59023.patch
> ]
> +Comment: No changes in any hunk
> +
> +Signed-off-by: Neetika Singh <[email protected]>
> +---
> + modules/core/src/persistence_json.cpp | 12 ++++++++++++
> + modules/core/src/persistence_xml.cpp  | 21 +++++++++++++++++++++
> + modules/core/src/persistence_yml.cpp  | 21 +++++++++++++++++++++
> + 3 files changed, 54 insertions(+)
> +
> +diff --git a/modules/core/src/persistence_json.cpp
> b/modules/core/src/persistence_json.cpp
> +index ae678e1b8b1..89914e6534f 100644
> +--- a/modules/core/src/persistence_json.cpp
> ++++ b/modules/core/src/persistence_json.cpp
> +@@ -296,6 +296,8 @@ class JSONParser : public FileStorageParser
> +
> +         while ( is_eof == false && is_completed == false )
> +         {
> ++            if (!ptr)
> ++                CV_PARSE_ERROR_CPP("Invalid input");
> +             switch ( *ptr )
> +             {
> +                 /* comment */
> +@@ -381,6 +383,7 @@ class JSONParser : public FileStorageParser
> +         if ( is_eof || !is_completed )
> +         {
> +             ptr = fs->bufferStart();
> ++            CV_Assert(ptr);
> +             *ptr = '\0';
> +             fs->setEof();
> +             if( !is_completed )
> +@@ -392,6 +395,9 @@ class JSONParser : public FileStorageParser
> +
> +     char* parseKey( char* ptr, FileNode& collection, FileNode&
> value_placeholder )
> +     {
> ++        if (!ptr)
> ++            CV_PARSE_ERROR_CPP("Invalid input");
> ++
> +         if( *ptr != '"' )
> +             CV_PARSE_ERROR_CPP( "Key must start with \'\"\'" );
> +
> +@@ -430,6 +436,9 @@ class JSONParser : public FileStorageParser
> +
> +     char* parseValue( char* ptr, FileNode& node )
> +     {
> ++        if (!ptr)
> ++            CV_PARSE_ERROR_CPP("Invalid value input");
> ++
> +         ptr = skipSpaces( ptr );
> +         if( !ptr || !*ptr )
> +             CV_PARSE_ERROR_CPP( "Unexpected End-Of-File" );
> +@@ -817,6 +826,9 @@ class JSONParser : public FileStorageParser
> +
> +     bool parse( char* ptr )
> +     {
> ++        if (!ptr)
> ++            CV_PARSE_ERROR_CPP("Invalid input");
> ++
> +         ptr = skipSpaces( ptr );
> +         if ( !ptr || !*ptr )
> +             return false;
> +diff --git a/modules/core/src/persistence_xml.cpp
> b/modules/core/src/persistence_xml.cpp
> +index fb30d90896e..89876dd3da8 100644
> +--- a/modules/core/src/persistence_xml.cpp
> ++++ b/modules/core/src/persistence_xml.cpp
> +@@ -360,6 +360,9 @@ class XMLParser : public FileStorageParser
> +
> +     char* skipSpaces( char* ptr, int mode )
> +     {
> ++        if (!ptr)
> ++            CV_PARSE_ERROR_CPP("Invalid input");
> ++
> +         int level = 0;
> +
> +         for(;;)
> +@@ -441,6 +444,9 @@ class XMLParser : public FileStorageParser
> +
> +     char* parseValue( char* ptr, FileNode& node )
> +     {
> ++        if (!ptr)
> ++            CV_PARSE_ERROR_CPP("Invalid input");
> ++
> +         FileNode new_elem;
> +         bool have_space = true;
> +         int value_type = node.type();
> +@@ -456,6 +462,8 @@ class XMLParser : public FileStorageParser
> +                 (c == '<' && ptr[1] == '!' && ptr[2] == '-') )
> +             {
> +                 ptr = skipSpaces( ptr, 0 );
> ++                if (!ptr)
> ++                    CV_PARSE_ERROR_CPP("Invalid input");
> +                 have_space = true;
> +                 c = *ptr;
> +             }
> +@@ -502,6 +510,8 @@ class XMLParser : public FileStorageParser
> +                 {
> +                     ptr = fs->parseBase64( ptr, 0, new_elem);
> +                     ptr = skipSpaces( ptr, 0 );
> ++                    if (!ptr)
> ++                        CV_PARSE_ERROR_CPP("Invalid input");
> +                 }
> +
> +                 ptr = parseTag( ptr, key2, type_name, tag_type );
> +@@ -645,6 +655,9 @@ class XMLParser : public FileStorageParser
> +     char* parseTag( char* ptr, std::string& tag_name,
> +                     std::string& type_name, int& tag_type )
> +     {
> ++        if (!ptr)
> ++            CV_PARSE_ERROR_CPP("Invalid tag input");
> ++
> +         if( *ptr == '\0' )
> +             CV_PARSE_ERROR_CPP( "Unexpected end of the stream" );
> +
> +@@ -702,6 +715,8 @@ class XMLParser : public FileStorageParser
> +                 if( *ptr != '=' )
> +                 {
> +                     ptr = skipSpaces( ptr, CV_XML_INSIDE_TAG );
> ++                    if (!ptr)
> ++                        CV_PARSE_ERROR_CPP("Invalid attribute");
> +                     if( *ptr != '=' )
> +                         CV_PARSE_ERROR_CPP( "Attribute name should be
> followed by \'=\'" );
> +                 }
> +@@ -740,6 +755,8 @@ class XMLParser : public FileStorageParser
> +             if( c != '>' )
> +             {
> +                 ptr = skipSpaces( ptr, CV_XML_INSIDE_TAG );
> ++                if (!ptr)
> ++                    CV_PARSE_ERROR_CPP("Invalid input");
> +                 c = *ptr;
> +             }
> +
> +@@ -781,6 +798,8 @@ class XMLParser : public FileStorageParser
> +
> +         // CV_XML_INSIDE_TAG is used to prohibit leading comments
> +         ptr = skipSpaces( ptr, CV_XML_INSIDE_TAG );
> ++        if (!ptr)
> ++            CV_PARSE_ERROR_CPP("Invalid input");
> +
> +         if( memcmp( ptr, "<?xml", 5 ) != 0 )  // FIXIT ptr[1..] - out of
> bounds read without check
> +             CV_PARSE_ERROR_CPP( "Valid XML should start with \'<?xml
> ...?>\'" );
> +@@ -791,6 +810,8 @@ class XMLParser : public FileStorageParser
> +         while( ptr && *ptr != '\0' )
> +         {
> +             ptr = skipSpaces( ptr, 0 );
> ++            if (!ptr)
> ++                CV_PARSE_ERROR_CPP("Invalid input");
> +
> +             if( *ptr != '\0' )
> +             {
> +diff --git a/modules/core/src/persistence_yml.cpp
> b/modules/core/src/persistence_yml.cpp
> +index 4129ca1dc57..7742e827701 100644
> +--- a/modules/core/src/persistence_yml.cpp
> ++++ b/modules/core/src/persistence_yml.cpp
> +@@ -330,6 +330,9 @@ class YAMLParser : public FileStorageParser
> +
> +     char* skipSpaces( char* ptr, int min_indent, int max_comment_indent )
> +     {
> ++        if (!ptr)
> ++            CV_PARSE_ERROR_CPP("Invalid input");
> ++
> +         for(;;)
> +         {
> +             while( *ptr == ' ' )
> +@@ -374,6 +377,9 @@ class YAMLParser : public FileStorageParser
> +
> +     bool getBase64Row(char* ptr, int indent, char* &beg, char* &end)
> +     {
> ++        if (!ptr)
> ++            CV_PARSE_ERROR_CPP("Invalid input");
> ++
> +         beg = end = ptr = skipSpaces(ptr, 0, INT_MAX);
> +         if (!ptr || !*ptr)
> +             return false; // end of file
> +@@ -394,6 +400,9 @@ class YAMLParser : public FileStorageParser
> +
> +     char* parseKey( char* ptr, FileNode& map_node, FileNode&
> value_placeholder )
> +     {
> ++        if (!ptr)
> ++            CV_PARSE_ERROR_CPP("Invalid input");
> ++
> +         char c;
> +         char *endptr = ptr - 1, *saveptr;
> +
> +@@ -422,6 +431,9 @@ class YAMLParser : public FileStorageParser
> +
> +     char* parseValue( char* ptr, FileNode& node, int min_indent, bool
> is_parent_flow )
> +     {
> ++        if (!ptr)
> ++            CV_PARSE_ERROR_CPP("Invalid input");
> ++
> +         char* endptr = 0;
> +         char c = ptr[0], d = ptr[1];
> +         int value_type = FileNode::NONE;
> +@@ -508,6 +520,8 @@ class YAMLParser : public FileStorageParser
> +
> +             *endptr = d;
> +             ptr = skipSpaces( endptr, min_indent, INT_MAX );
> ++            if (!ptr)
> ++                CV_PARSE_ERROR_CPP("Invalid input");
> +
> +             c = *ptr;
> +
> +@@ -634,6 +648,8 @@ class YAMLParser : public FileStorageParser
> +                 FileNode elem;
> +
> +                 ptr = skipSpaces( ptr, new_min_indent, INT_MAX );
> ++                if (!ptr)
> ++                    CV_PARSE_ERROR_CPP("Invalid input");
> +                 if( *ptr == '}' || *ptr == ']' )
> +                 {
> +                     if( *ptr != d )
> +@@ -647,6 +663,8 @@ class YAMLParser : public FileStorageParser
> +                     if( *ptr != ',' )
> +                         CV_PARSE_ERROR_CPP( "Missing , between the
> elements" );
> +                     ptr = skipSpaces( ptr + 1, new_min_indent, INT_MAX );
> ++                    if (!ptr)
> ++                        CV_PARSE_ERROR_CPP("Invalid input");
> +                 }
> +
> +                 if( struct_type == FileNode::MAP )
> +@@ -746,6 +764,9 @@ class YAMLParser : public FileStorageParser
> +
> +     bool parse( char* ptr )
> +     {
> ++        if (!ptr)
> ++            CV_PARSE_ERROR_CPP("Invalid input");
> ++
> +         bool first = true;
> +         bool ok = true;
> +         FileNode root_collection(fs->getFS(), 0, 0);
> +
> diff --git a/meta-oe/recipes-support/opencv/opencv/CVE-2019-15939.patch
> b/meta-oe/recipes-support/opencv/opencv/CVE-2019-15939.patch
> new file mode 100644
> index 0000000..35d62cf
> --- /dev/null
> +++ b/meta-oe/recipes-support/opencv/opencv/CVE-2019-15939.patch
> @@ -0,0 +1,73 @@
> +From 5a497077f109d543ab86dfdf8add1c76c0e47d29 Mon Sep 17 00:00:00 2001
> +From: Alexander Alekhin <[email protected]>
> +Date: Fri, 23 Aug 2019 16:14:53 +0300
> +Subject: [PATCH] objdetect: add input check in HOG detector
> +
> +CVE: CVE-2019-15939
> +Upstream-Status: Backport [
> https://github.com/opencv/opencv/commit/5a497077f109d543ab86dfdf8add1c76c0e47d29.patch
> ]
> +Comment: No changes in any hunk
> +
> +Signed-off-by: Neetika Singh <[email protected]>
> +---
> + modules/objdetect/src/hog.cpp | 19 ++++++++++++-------
> + 1 file changed, 12 insertions(+), 7 deletions(-)
> +
> +diff --git a/modules/objdetect/src/hog.cpp b/modules/objdetect/src/hog.cpp
> +index 9524851eebb..378bab30876 100644
> +--- a/modules/objdetect/src/hog.cpp
> ++++ b/modules/objdetect/src/hog.cpp
> +@@ -68,6 +68,7 @@ enum {DESCR_FORMAT_COL_BY_COL, DESCR_FORMAT_ROW_BY_ROW};
> +
> + static int numPartsWithin(int size, int part_size, int stride)
> + {
> ++    CV_Assert(stride != 0);
> +     return (size - part_size + stride) / stride;
> + }
> +
> +@@ -80,13 +81,17 @@ static Size numPartsWithin(cv::Size size, cv::Size
> part_size,
> +
> + static size_t getBlockHistogramSize(Size block_size, Size cell_size, int
> nbins)
> + {
> ++    CV_Assert(!cell_size.empty());
> +     Size cells_per_block = Size(block_size.width / cell_size.width,
> +-        block_size.height / cell_size.height);
> ++                                block_size.height / cell_size.height);
> +     return (size_t)(nbins * cells_per_block.area());
> + }
> +
> + size_t HOGDescriptor::getDescriptorSize() const
> + {
> ++    CV_Assert(!cellSize.empty());
> ++    CV_Assert(!blockStride.empty());
> ++
> +     CV_Assert(blockSize.width % cellSize.width == 0 &&
> +         blockSize.height % cellSize.height == 0);
> +     CV_Assert((winSize.width - blockSize.width) % blockStride.width == 0
> &&
> +@@ -144,20 +149,20 @@ bool HOGDescriptor::read(FileNode& obj)
> +     if( !obj.isMap() )
> +         return false;
> +     FileNodeIterator it = obj["winSize"].begin();
> +-    it >> winSize.width >> winSize.height;
> ++    it >> winSize.width >> winSize.height; CV_Assert(!winSize.empty());
> +     it = obj["blockSize"].begin();
> +-    it >> blockSize.width >> blockSize.height;
> ++    it >> blockSize.width >> blockSize.height;
> CV_Assert(!blockSize.empty());
> +     it = obj["blockStride"].begin();
> +-    it >> blockStride.width >> blockStride.height;
> ++    it >> blockStride.width >> blockStride.height;
> CV_Assert(!blockStride.empty());
> +     it = obj["cellSize"].begin();
> +-    it >> cellSize.width >> cellSize.height;
> +-    obj["nbins"] >> nbins;
> ++    it >> cellSize.width >> cellSize.height;
> CV_Assert(!cellSize.empty());
> ++    obj["nbins"] >> nbins; CV_Assert(nbins > 0);
> +     obj["derivAperture"] >> derivAperture;
> +     obj["winSigma"] >> winSigma;
> +     obj["histogramNormType"] >> histogramNormType;
> +     obj["L2HysThreshold"] >> L2HysThreshold;
> +     obj["gammaCorrection"] >> gammaCorrection;
> +-    obj["nlevels"] >> nlevels;
> ++    obj["nlevels"] >> nlevels; CV_Assert(nlevels > 0);
> +     if (obj["signedGradient"].empty())
> +         signedGradient = false;
> +     else
> +
> diff --git a/meta-oe/recipes-support/opencv/opencv/CVE-2019-19624.patch
> b/meta-oe/recipes-support/opencv/opencv/CVE-2019-19624.patch
> new file mode 100644
> index 0000000..923ca2a
> --- /dev/null
> +++ b/meta-oe/recipes-support/opencv/opencv/CVE-2019-19624.patch
> @@ -0,0 +1,157 @@
> +From d1615ba11a93062b1429fce9f0f638d1572d3418 Mon Sep 17 00:00:00 2001
> +From: Thang Tran <[email protected]>
> +Date: Mon, 27 May 2019 08:18:26 +0200
> +Subject: [PATCH] video:fixed DISOpticalFlow segfault from small img
> +
> +CVE: CVE-2019-19624
> +Upstream-Status: Backport [
> https://github.com/opencv/opencv/commit/d1615ba11a93062b1429fce9f0f638d1572d3418.patch
> ]
> +Comment: No changes in any hunk
> +
> +Signed-off-by: Neetika Singh <[email protected]>
> +---
> + modules/video/src/dis_flow.cpp          | 67 ++++++++++++++++++++++++-
> + modules/video/test/test_OF_accuracy.cpp | 28 +++++++++++
> + 2 files changed, 93 insertions(+), 2 deletions(-)
> +
> +diff --git a/modules/video/src/dis_flow.cpp
> b/modules/video/src/dis_flow.cpp
> +index a453d8b2b51..806d6f1ddaf 100644
> +--- a/modules/video/src/dis_flow.cpp
> ++++ b/modules/video/src/dis_flow.cpp
> +@@ -140,6 +140,8 @@ class DISOpticalFlowImpl CV_FINAL : public
> DISOpticalFlow
> +     void prepareBuffers(Mat &I0, Mat &I1, Mat &flow, bool use_flow);
> +     void precomputeStructureTensor(Mat &dst_I0xx, Mat &dst_I0yy, Mat
> &dst_I0xy, Mat &dst_I0x, Mat &dst_I0y, Mat &I0x,
> +                                    Mat &I0y);
> ++    int autoSelectCoarsestScale(int img_width);
> ++    void autoSelectPatchSizeAndScales(int img_width);
> +
> +     struct PatchInverseSearch_ParBody : public ParallelLoopBody
> +     {
> +@@ -435,6 +437,44 @@ void
> DISOpticalFlowImpl::precomputeStructureTensor(Mat &dst_I0xx, Mat &dst_I0yy,
> +     }
> + }
> +
> ++int DISOpticalFlowImpl::autoSelectCoarsestScale(int img_width)
> ++{
> ++    const int fratio = 5;
> ++    return std::max(0, (int)std::floor(log2((2.0f*(float)img_width) /
> ((float)fratio * (float)patch_size))));
> ++}
> ++
> ++void DISOpticalFlowImpl::autoSelectPatchSizeAndScales(int img_width)
> ++{
> ++    switch (finest_scale)
> ++    {
> ++    case 1:
> ++        patch_size = 8;
> ++        coarsest_scale = autoSelectCoarsestScale(img_width);
> ++        finest_scale = std::max(coarsest_scale-2, 0);
> ++        break;
> ++
> ++    case 3:
> ++        patch_size = 12;
> ++        coarsest_scale = autoSelectCoarsestScale(img_width);
> ++        finest_scale = std::max(coarsest_scale-4, 0);
> ++        break;
> ++
> ++    case 4:
> ++        patch_size = 12;
> ++        coarsest_scale = autoSelectCoarsestScale(img_width);
> ++        finest_scale = std::max(coarsest_scale-5, 0);
> ++        break;
> ++
> ++    // default case, fall-through.
> ++    case 2:
> ++    default:
> ++        patch_size = 8;
> ++        coarsest_scale = autoSelectCoarsestScale(img_width);
> ++        finest_scale = std::max(coarsest_scale-2, 0);
> ++        break;
> ++    }
> ++}
> ++
> +
> DISOpticalFlowImpl::PatchInverseSearch_ParBody::PatchInverseSearch_ParBody(DISOpticalFlowImpl
> &_dis, int _nstripes,
> +
>   int _hs, Mat &dst_Sx, Mat &dst_Sy,
> +
>   Mat &src_Ux, Mat &src_Uy, Mat &_I0, Mat &_I1,
> +@@ -1318,9 +1358,20 @@ bool DISOpticalFlowImpl::ocl_calc(InputArray I0,
> InputArray I1, InputOutputArray
> +     else
> +         flow.create(I1Mat.size(), CV_32FC2);
> +     UMat &u_flowMat = flow.getUMatRef();
> +-    coarsest_scale = min((int)(log(max(I0Mat.cols, I0Mat.rows) / (4.0 *
> patch_size)) / log(2.0) + 0.5), /* Original code serach for maximal
> movement of width/4 */
> ++    coarsest_scale = min((int)(log(max(I0Mat.cols, I0Mat.rows) / (4.0 *
> patch_size)) / log(2.0) + 0.5), /* Original code search for maximal
> movement of width/4 */
> +                          (int)(log(min(I0Mat.cols, I0Mat.rows) /
> patch_size) / log(2.0)));              /* Deepest pyramid level greater or
> equal than patch*/
> +
> ++    if (coarsest_scale<0)
> ++        CV_Error(cv::Error::StsBadSize, "The input image must have
> either width or height >= 12");
> ++
> ++    if (coarsest_scale<finest_scale)
> ++    {
> ++        // choose the finest level based on coarsest level.
> ++        // Refs:
> https://github.com/tikroeger/OF_DIS/blob/2c9f2a674f3128d3a41c10e41cc9f3a35bb1b523/run_dense.cpp#L239
> ++        int original_img_width = I0.size().width;
> ++        autoSelectPatchSizeAndScales(original_img_width);
> ++    }
> ++
> +     ocl_prepareBuffers(I0Mat, I1Mat, u_flowMat, use_input_flow);
> +     u_Ux[coarsest_scale].setTo(0.0f);
> +     u_Uy[coarsest_scale].setTo(0.0f);
> +@@ -1385,8 +1436,20 @@ void DISOpticalFlowImpl::calc(InputArray I0,
> InputArray I1, InputOutputArray flo
> +     else
> +         flow.create(I1Mat.size(), CV_32FC2);
> +     Mat flowMat = flow.getMat();
> +-    coarsest_scale = min((int)(log(max(I0Mat.cols, I0Mat.rows) / (4.0 *
> patch_size)) / log(2.0) + 0.5), /* Original code serach for maximal
> movement of width/4 */
> ++    coarsest_scale = min((int)(log(max(I0Mat.cols, I0Mat.rows) / (4.0 *
> patch_size)) / log(2.0) + 0.5), /* Original code search for maximal
> movement of width/4 */
> +                          (int)(log(min(I0Mat.cols, I0Mat.rows) /
> patch_size) / log(2.0)));              /* Deepest pyramid level greater or
> equal than patch*/
> ++
> ++    if (coarsest_scale<0)
> ++        CV_Error(cv::Error::StsBadSize, "The input image must have
> either width or height >= 12");
> ++
> ++    if (coarsest_scale<finest_scale)
> ++    {
> ++        // choose the finest level based on coarsest level.
> ++        // Refs:
> https://github.com/tikroeger/OF_DIS/blob/2c9f2a674f3128d3a41c10e41cc9f3a35bb1b523/run_dense.cpp#L239
> ++        int original_img_width = I0.size().width;
> ++        autoSelectPatchSizeAndScales(original_img_width);
> ++    }
> ++
> +     int num_stripes = getNumThreads();
> +
> +     prepareBuffers(I0Mat, I1Mat, flowMat, use_input_flow);
> +diff --git a/modules/video/test/test_OF_accuracy.cpp
> b/modules/video/test/test_OF_accuracy.cpp
> +index affbab65866..b99ffce2a8b 100644
> +--- a/modules/video/test/test_OF_accuracy.cpp
> ++++ b/modules/video/test/test_OF_accuracy.cpp
> +@@ -121,6 +121,34 @@ TEST(DenseOpticalFlow_DIS, ReferenceAccuracy)
> +     }
> + }
> +
> ++TEST(DenseOpticalFlow_DIS, InvalidImgSize_CoarsestLevelLessThanZero)
> ++{
> ++    cv::Ptr<cv::DISOpticalFlow> of = cv::DISOpticalFlow::create();
> ++    const int mat_size = 10;
> ++
> ++    cv::Mat x(mat_size, mat_size, CV_8UC1, 42);
> ++    cv::Mat y(mat_size, mat_size, CV_8UC1, 42);
> ++    cv::Mat flow;
> ++
> ++    ASSERT_THROW(of->calc(x, y, flow), cv::Exception);
> ++}
> ++
> ++// make sure that autoSelectPatchSizeAndScales() works properly.
> ++TEST(DenseOpticalFlow_DIS,
> InvalidImgSize_CoarsestLevelLessThanFinestLevel)
> ++{
> ++    cv::Ptr<cv::DISOpticalFlow> of = cv::DISOpticalFlow::create();
> ++    const int mat_size = 80;
> ++
> ++    cv::Mat x(mat_size, mat_size, CV_8UC1, 42);
> ++    cv::Mat y(mat_size, mat_size, CV_8UC1, 42);
> ++    cv::Mat flow;
> ++
> ++    of->calc(x, y, flow);
> ++
> ++    ASSERT_EQ(flow.rows, mat_size);
> ++    ASSERT_EQ(flow.cols, mat_size);
> ++}
> ++
> + TEST(DenseOpticalFlow_VariationalRefinement, ReferenceAccuracy)
> + {
> +     Mat frame1, frame2, GT;
> +
> diff --git a/meta-oe/recipes-support/opencv/opencv_4.1.0.bb
> b/meta-oe/recipes-support/opencv/opencv_4.1.0.bb
> index d781da6..de708fd 100644
> --- a/meta-oe/recipes-support/opencv/opencv_4.1.0.bb
> +++ b/meta-oe/recipes-support/opencv/opencv_4.1.0.bb
> @@ -50,6 +50,10 @@ SRC_URI = "git://
> github.com/opencv/opencv.git;name=opencv \
>             file://0001-Dont-use-isystem.patch \
>
> file://0001-carotene-Replace-ipcp-unit-growth-with-ipa-cp-unit-g.patch \
>             file://download.patch \
> +           file://CVE-2019-14491.patch \
> +           file://CVE-2019-14493.patch \
> +           file://CVE-2019-15939.patch \
> +           file://CVE-2019-19624.patch \
>             "
>  PV = "4.1.0"
>
> --
> 2.7.4
>
> This message contains information that may be privileged or confidential
> and is the property of the KPIT Technologies Ltd. It is intended only for
> the person to whom it is addressed. If you are not the intended recipient,
> you are not authorized to read, print, retain copy, disseminate,
> distribute, or use this message or any part thereof. If you receive this
> message in error, please notify the sender immediately and delete all
> copies of this message. KPIT Technologies Ltd. does not accept any
> liability for virus infected mails.
>
> 
>
>
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#90232): 
https://lists.openembedded.org/g/openembedded-devel/message/90232
Mute This Topic: https://lists.openembedded.org/mt/81205453/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-devel/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to