imgproc(warpAffine): avoid buffer indexes overflow in SIMD code
authorAlexander Alekhin <alexander.a.alekhin@gmail.com>
Thu, 25 Feb 2021 20:16:50 +0000 (20:16 +0000)
committerAlexander Alekhin <alexander.a.alekhin@gmail.com>
Thu, 25 Feb 2021 20:16:50 +0000 (20:16 +0000)
modules/imgproc/src/imgwarp.cpp
modules/imgproc/test/test_imgwarp.cpp

index 1665e0a40c7f6f766d2acf9b9f86c8bd83cb96ed..298f9b3b5bbd696f9db52ec0f583f689b3847b9b 100644 (file)
@@ -446,7 +446,7 @@ struct RemapVec_8u
     {
         int cn = _src.channels(), x = 0, sstep = (int)_src.step;
 
-        if( (cn != 1 && cn != 3 && cn != 4) || sstep > 0x8000 )
+        if( (cn != 1 && cn != 3 && cn != 4) || sstep >= 0x8000 )
             return 0;
 
         const uchar *S0 = _src.ptr(), *S1 = _src.ptr(1);
index 73d513e85f8453f780d01a618335991561e1e256..7d0360dfb1453adfdf1e3b56399523d5122fdd81 100644 (file)
@@ -1781,6 +1781,26 @@ TEST(Imgproc_Warp, multichannel)
     }
 }
 
+
+TEST(Imgproc_Warp, regression_19566)  // valgrind should detect problem if any
+{
+    const Size imgSize(8192, 8);
+
+    Mat inMat = Mat::zeros(imgSize, CV_8UC4);
+    Mat outMat = Mat::zeros(imgSize, CV_8UC4);
+
+    warpAffine(
+        inMat,
+        outMat,
+        getRotationMatrix2D(Point2f(imgSize.width / 2.0f, imgSize.height / 2.0f), 45.0, 1.0),
+        imgSize,
+        INTER_LINEAR,
+        cv::BORDER_CONSTANT,
+        cv::Scalar(0.0, 0.0, 0.0, 255.0)
+    );
+}
+
+
 TEST(Imgproc_GetAffineTransform, singularity)
 {
     Point2f A_sample[3];