diff options
author | Joe Downing <joedow@google.com> | 2022-06-06 17:50:23 +0000 |
---|---|---|
committer | Frank Barchard <fbarchard@chromium.org> | 2022-06-07 01:20:14 +0000 |
commit | c0c8c40b31636e575eaf07921d58d8f4ff3aa983 (patch) | |
tree | ba4ac530c7714d19e51bd8490da51c9ad2f9bb87 /unit_test | |
parent | f8a1ee331419d5737e28a08ef97756e808965269 (diff) | |
download | libyuv-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.cc | 35 |
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; |