From 3c862e3d29f326902656c23b7e309f32adb7822c Mon Sep 17 00:00:00 2001 From: Frank Barchard Date: Fri, 8 Apr 2016 15:58:53 -0700 Subject: [PATCH] Fix stride bug for msan on I420Interpolate. When using C version of I420Interpolate for msan, a 50% interpolation would cause stride to be cast to int, which could cause erroneous memory reads on 64 bit build. This CL makes the stride use ptrdiff_t for HalfRow_C BUG=libyuv:582 TESTED=try bots tests R=dhrosa@google.com Review URL: https://codereview.chromium.org/1872953002 . --- README.chromium | 2 +- include/libyuv/version.h | 2 +- source/planar_functions.cc | 3 +-- source/row_common.cc | 8 ++++---- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/README.chromium b/README.chromium index a8213de68..0f362bd5b 100644 --- a/README.chromium +++ b/README.chromium @@ -1,6 +1,6 @@ Name: libyuv URL: http://code.google.com/p/libyuv/ -Version: 1582 +Version: 1583 License: BSD License File: LICENSE diff --git a/include/libyuv/version.h b/include/libyuv/version.h index 72615542c..ed9543fdd 100644 --- a/include/libyuv/version.h +++ b/include/libyuv/version.h @@ -11,6 +11,6 @@ #ifndef INCLUDE_LIBYUV_VERSION_H_ // NOLINT #define INCLUDE_LIBYUV_VERSION_H_ -#define LIBYUV_VERSION 1582 +#define LIBYUV_VERSION 1583 #endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT diff --git a/source/planar_functions.cc b/source/planar_functions.cc index 851c0fea9..73fa7d284 100644 --- a/source/planar_functions.cc +++ b/source/planar_functions.cc @@ -1917,8 +1917,7 @@ int InterpolatePlane(const uint8* src0, int src_stride0, #endif for (y = 0; y < height; ++y) { - InterpolateRow(dst, src0, src1 - src0, - width, interpolation); + InterpolateRow(dst, src0, src1 - src0, width, interpolation); src0 += src_stride0; src1 += src_stride1; dst += dst_stride; diff --git a/source/row_common.cc b/source/row_common.cc index 2b80d074c..0c47e1016 100644 --- a/source/row_common.cc +++ b/source/row_common.cc @@ -2147,7 +2147,7 @@ void ARGBAffineRow_C(const uint8* src_argb, int src_argb_stride, } // Blend 2 rows into 1. -static void HalfRow_C(const uint8* src_uv, int src_uv_stride, +static void HalfRow_C(const uint8* src_uv, ptrdiff_t src_uv_stride, uint8* dst_uv, int width) { int x; for (x = 0; x < width; ++x) { @@ -2155,7 +2155,7 @@ static void HalfRow_C(const uint8* src_uv, int src_uv_stride, } } -static void HalfRow_16_C(const uint16* src_uv, int src_uv_stride, +static void HalfRow_16_C(const uint16* src_uv, ptrdiff_t src_uv_stride, uint16* dst_uv, int width) { int x; for (x = 0; x < width; ++x) { @@ -2176,7 +2176,7 @@ void InterpolateRow_C(uint8* dst_ptr, const uint8* src_ptr, return; } if (y1_fraction == 128) { - HalfRow_C(src_ptr, (int)(src_stride), dst_ptr, width); + HalfRow_C(src_ptr, src_stride, dst_ptr, width); return; } for (x = 0; x < width - 1; x += 2) { @@ -2206,7 +2206,7 @@ void InterpolateRow_16_C(uint16* dst_ptr, const uint16* src_ptr, return; } if (source_y_fraction == 128) { - HalfRow_16_C(src_ptr, (int)(src_stride), dst_ptr, width); + HalfRow_16_C(src_ptr, src_stride, dst_ptr, width); return; } for (x = 0; x < width - 1; x += 2) {