You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
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>
This commit is contained in:
committed by
Anton Khirnov
parent
daf9890811
commit
998e8519ef
@@ -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;
|
||||
|
Reference in New Issue
Block a user