diff options
author | Stefano Sabatini <stefano.sabatini-lala@poste.it> | 2011-08-12 10:42:35 +0400 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2011-09-29 09:19:30 +0400 |
commit | 998e8519efbc772994c5ba19c0d39573998be9db (patch) | |
tree | 86fce78e47359085f0e28004155b92df58f9585f | |
parent | daf98908118074e96199ca7195663af4543d3808 (diff) |
vf_unsharp: fix out-of-buffer read
In apply_unsharp(), when y is >= height, prevent out-of-buffer reading
from src, read from the last buffer line in src2 instead.
The check was implemented in the original unsharp libmpcodecs code and
lost in the port.
This also fixes output discrepancy between the two filters.
Signed-off-by: Anton Khirnov <anton@khirnov.net>
-rw-r--r-- | libavfilter/vf_unsharp.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/libavfilter/vf_unsharp.c b/libavfilter/vf_unsharp.c index 8a4f9c7a0c..ebc8f04bbd 100644 --- a/libavfilter/vf_unsharp.c +++ b/libavfilter/vf_unsharp.c @@ -73,6 +73,7 @@ static void apply_unsharp( uint8_t *dst, int dst_stride, int32_t res; int x, y, z; + const uint8_t *src2; if (!fp->amount) { if (dst_stride == src_stride) @@ -87,9 +88,12 @@ static void apply_unsharp( uint8_t *dst, int dst_stride, memset(sc[y], 0, sizeof(sc[y][0]) * (width + 2 * fp->steps_x)); for (y = -fp->steps_y; y < height + fp->steps_y; y++) { + if (y < height) + src2 = src; + memset(sr, 0, sizeof(sr[0]) * (2 * fp->steps_x - 1)); for (x = -fp->steps_x; x < width + fp->steps_x; x++) { - tmp1 = x <= 0 ? src[0] : x >= width ? src[width-1] : src[x]; + tmp1 = x <= 0 ? src2[0] : x >= width ? src2[width-1] : src2[x]; for (z = 0; z < fp->steps_x * 2; z += 2) { tmp2 = sr[z + 0] + tmp1; sr[z + 0] = tmp1; tmp1 = sr[z + 1] + tmp2; sr[z + 1] = tmp2; |