diff --git a/modules/core/src/matrix.cpp b/modules/core/src/matrix.cpp index 5f67814639..3480fffe78 100644 --- a/modules/core/src/matrix.cpp +++ b/modules/core/src/matrix.cpp @@ -315,7 +315,7 @@ void finalizeHdr(Mat& m) m.rows = m.cols = -1; if(m.u) m.datastart = m.data = m.u->data; - if( m.data ) + if( m.data && d > 0 ) { m.datalimit = m.datastart + m.size[0]*m.step[0]; if( m.size[0] > 0 ) @@ -328,7 +328,7 @@ void finalizeHdr(Mat& m) m.dataend = m.datalimit; } else - m.dataend = m.datalimit = 0; + m.dataend = m.datalimit = m.data; } //======================================= Mat ====================================================== diff --git a/modules/core/test/test_mat.cpp b/modules/core/test/test_mat.cpp index b8adde52b3..ea6370cfb0 100644 --- a/modules/core/test/test_mat.cpp +++ b/modules/core/test/test_mat.cpp @@ -1446,6 +1446,25 @@ TEST(Core_Mat, regression_9507) EXPECT_EQ(25u, m2.total()); } +TEST(Core_Mat, empty) +{ + // Should not crash. + uint8_t data[2] = {0, 1}; + cv::Mat mat_nd(/*ndims=*/0, /*sizes=*/nullptr, CV_8UC1, /*data=*/data); + cv::Mat1b mat(0, 0, /*data=*/data, /*steps=*/1); + EXPECT_EQ(mat_nd.dims, 0); + EXPECT_EQ(mat.dims, 2); +#if CV_VERSION_MAJOR < 5 + EXPECT_LE(mat_nd.total(), 0u); + EXPECT_TRUE(mat_nd.empty()); +#else + EXPECT_LE(mat_nd.total(), 1u); + EXPECT_FALSE(mat_nd.empty()); +#endif + EXPECT_EQ(mat.total(), 0u); + EXPECT_TRUE(mat.empty()); +} + TEST(Core_InputArray, empty) { vector > data;