From 307dc2a298e7a53d2e852dc14fd6bac036961f39 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Fri, 6 Sep 2024 15:13:55 +0300 Subject: [PATCH] Excluded nullptr leak to arithmetic HAL got from empty Mat. --- modules/core/src/arithm.cpp | 41 +++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/modules/core/src/arithm.cpp b/modules/core/src/arithm.cpp index 08e1f613ef..72d5806ebb 100644 --- a/modules/core/src/arithm.cpp +++ b/modules/core/src/arithm.cpp @@ -997,6 +997,13 @@ void cv::add( InputArray src1, InputArray src2, OutputArray dst, { CV_INSTRUMENT_REGION(); + CV_Assert(src1.empty() == src2.empty()); + if (src1.empty() && src2.empty()) + { + dst.release(); + return; + } + arithm_op(src1, src2, dst, mask, dtype, getAddTab(), false, 0, OCL_OP_ADD ); } @@ -1005,6 +1012,13 @@ void cv::subtract( InputArray _src1, InputArray _src2, OutputArray _dst, { CV_INSTRUMENT_REGION(); + CV_Assert(_src1.empty() == _src2.empty()); + if (_src1.empty() && _src2.empty()) + { + _dst.release(); + return; + } + ExtendedTypeFunc subExtFunc = getSubExtFunc(_src1.depth(), _src2.depth(), dtype < 0 ? _dst.depth() : dtype); arithm_op(_src1, _src2, _dst, mask, dtype, getSubTab(), false, 0, OCL_OP_SUB, /* extendedFunc */ subExtFunc); @@ -1014,6 +1028,13 @@ void cv::absdiff( InputArray src1, InputArray src2, OutputArray dst ) { CV_INSTRUMENT_REGION(); + CV_Assert(src1.empty() == src2.empty()); + if (src1.empty() && src2.empty()) + { + dst.release(); + return; + } + arithm_op(src1, src2, dst, noArray(), -1, getAbsDiffTab(), false, 0, OCL_OP_ABSDIFF); } @@ -1131,6 +1152,13 @@ void divide(InputArray src1, InputArray src2, { CV_INSTRUMENT_REGION(); + CV_Assert(src1.empty() == src2.empty()); + if (src1.empty() && src2.empty()) + { + dst.release(); + return; + } + arithm_op(src1, src2, dst, noArray(), dtype, getDivTab(), true, &scale, OCL_OP_DIV_SCALE); } @@ -1139,6 +1167,12 @@ void divide(double scale, InputArray src2, { CV_INSTRUMENT_REGION(); + if (src2.empty()) + { + dst.release(); + return; + } + arithm_op(src2, src2, dst, noArray(), dtype, getRecipTab(), true, &scale, OCL_OP_RECIP_SCALE); } @@ -1172,6 +1206,13 @@ void cv::addWeighted( InputArray src1, double alpha, InputArray src2, { CV_INSTRUMENT_REGION(); + CV_Assert(src1.empty() == src2.empty()); + if (src1.empty() && src2.empty()) + { + dst.release(); + return; + } + double scalars[] = {alpha, beta, gamma}; arithm_op(src1, src2, dst, noArray(), dtype, getAddWeightedTab(), true, scalars, OCL_OP_ADDW); }