aboutsummaryrefslogtreecommitdiff
path: root/unit_test
diff options
context:
space:
mode:
authorJoe Downing <joedow@google.com>2022-06-06 17:50:23 +0000
committerFrank Barchard <fbarchard@chromium.org>2022-06-07 01:20:14 +0000
commitc0c8c40b31636e575eaf07921d58d8f4ff3aa983 (patch)
treeba4ac530c7714d19e51bd8490da51c9ad2f9bb87 /unit_test
parentf8a1ee331419d5737e28a08ef97756e808965269 (diff)
downloadlibyuv-c0c8c40b31636e575eaf07921d58d8f4ff3aa983.tar.gz
Update CopyPlane to handle 0 width and height dimensions
If a width, height, and src/dst strides passed in are all 0, height is updated to 1 which means some CPU optimized functions may try to copy data when the dst rect is not valid. Bug: b:234340482 Change-Id: I63be1c6ba05d669d67f5079d812acbec09c8f6c9 Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/3689909 Reviewed-by: Frank Barchard <fbarchard@chromium.org>
Diffstat (limited to 'unit_test')
-rw-r--r--unit_test/planar_test.cc35
1 files changed, 35 insertions, 0 deletions
diff --git a/unit_test/planar_test.cc b/unit_test/planar_test.cc
index 833091a1..8f5a33cb 100644
--- a/unit_test/planar_test.cc
+++ b/unit_test/planar_test.cc
@@ -1484,6 +1484,41 @@ TEST_F(LibYUVPlanarTest, TestCopyPlane) {
EXPECT_EQ(0, err);
}
+TEST_F(LibYUVPlanarTest, TestCopyPlaneZeroDimensionRegressionTest) {
+ // Regression test to verify copying a rect with a zero height or width does
+ // not lead to memory corruption.
+ uint8_t src = 42;
+ uint8_t dst = 0;
+
+ // Disable all optimizations.
+ MaskCpuFlags(disable_cpu_flags_);
+ CopyPlane(&src, 0, &dst, 0, 0, 0);
+ EXPECT_EQ(src, 42);
+ EXPECT_EQ(dst, 0);
+
+ CopyPlane(&src, 1, &dst, 1, 1, 0);
+ EXPECT_EQ(src, 42);
+ EXPECT_EQ(dst, 0);
+
+ CopyPlane(&src, 1, &dst, 1, 0, 1);
+ EXPECT_EQ(src, 42);
+ EXPECT_EQ(dst, 0);
+
+ // Enable optimizations.
+ MaskCpuFlags(benchmark_cpu_info_);
+ CopyPlane(&src, 0, &dst, 0, 0, 0);
+ EXPECT_EQ(src, 42);
+ EXPECT_EQ(dst, 0);
+
+ CopyPlane(&src, 1, &dst, 1, 1, 0);
+ EXPECT_EQ(src, 42);
+ EXPECT_EQ(dst, 0);
+
+ CopyPlane(&src, 1, &dst, 1, 0, 1);
+ EXPECT_EQ(src, 42);
+ EXPECT_EQ(dst, 0);
+}
+
TEST_F(LibYUVPlanarTest, TestDetilePlane) {
int i, j;