Skip to content

Commit a7d942b

Browse files
authored
Merge pull request opencv#26125 from asmorkalov:as/HAL_fix_nullprt_leak
Excluded nullptr leak to arithmetic HAL got from empty Mat.
2 parents 6cc1669 + 307dc2a commit a7d942b

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

modules/core/src/arithm.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,13 @@ void cv::add( InputArray src1, InputArray src2, OutputArray dst,
997997
{
998998
CV_INSTRUMENT_REGION();
999999

1000+
CV_Assert(src1.empty() == src2.empty());
1001+
if (src1.empty() && src2.empty())
1002+
{
1003+
dst.release();
1004+
return;
1005+
}
1006+
10001007
arithm_op(src1, src2, dst, mask, dtype, getAddTab(), false, 0, OCL_OP_ADD );
10011008
}
10021009

@@ -1005,6 +1012,13 @@ void cv::subtract( InputArray _src1, InputArray _src2, OutputArray _dst,
10051012
{
10061013
CV_INSTRUMENT_REGION();
10071014

1015+
CV_Assert(_src1.empty() == _src2.empty());
1016+
if (_src1.empty() && _src2.empty())
1017+
{
1018+
_dst.release();
1019+
return;
1020+
}
1021+
10081022
ExtendedTypeFunc subExtFunc = getSubExtFunc(_src1.depth(), _src2.depth(), dtype < 0 ? _dst.depth() : dtype);
10091023
arithm_op(_src1, _src2, _dst, mask, dtype, getSubTab(), false, 0, OCL_OP_SUB,
10101024
/* extendedFunc */ subExtFunc);
@@ -1014,6 +1028,13 @@ void cv::absdiff( InputArray src1, InputArray src2, OutputArray dst )
10141028
{
10151029
CV_INSTRUMENT_REGION();
10161030

1031+
CV_Assert(src1.empty() == src2.empty());
1032+
if (src1.empty() && src2.empty())
1033+
{
1034+
dst.release();
1035+
return;
1036+
}
1037+
10171038
arithm_op(src1, src2, dst, noArray(), -1, getAbsDiffTab(), false, 0, OCL_OP_ABSDIFF);
10181039
}
10191040

@@ -1131,6 +1152,13 @@ void divide(InputArray src1, InputArray src2,
11311152
{
11321153
CV_INSTRUMENT_REGION();
11331154

1155+
CV_Assert(src1.empty() == src2.empty());
1156+
if (src1.empty() && src2.empty())
1157+
{
1158+
dst.release();
1159+
return;
1160+
}
1161+
11341162
arithm_op(src1, src2, dst, noArray(), dtype, getDivTab(), true, &scale, OCL_OP_DIV_SCALE);
11351163
}
11361164

@@ -1139,6 +1167,12 @@ void divide(double scale, InputArray src2,
11391167
{
11401168
CV_INSTRUMENT_REGION();
11411169

1170+
if (src2.empty())
1171+
{
1172+
dst.release();
1173+
return;
1174+
}
1175+
11421176
arithm_op(src2, src2, dst, noArray(), dtype, getRecipTab(), true, &scale, OCL_OP_RECIP_SCALE);
11431177
}
11441178

@@ -1172,6 +1206,13 @@ void cv::addWeighted( InputArray src1, double alpha, InputArray src2,
11721206
{
11731207
CV_INSTRUMENT_REGION();
11741208

1209+
CV_Assert(src1.empty() == src2.empty());
1210+
if (src1.empty() && src2.empty())
1211+
{
1212+
dst.release();
1213+
return;
1214+
}
1215+
11751216
double scalars[] = {alpha, beta, gamma};
11761217
arithm_op(src1, src2, dst, noArray(), dtype, getAddWeightedTab(), true, scalars, OCL_OP_ADDW);
11771218
}

0 commit comments

Comments
 (0)