If x is 0, 'x - 1' is in the previous line, or worse outside the buffer
for the first line.

If y is 0, 'x - image->comps[compno].w' is outside the buffer.

Finally, image->comps[compno].w is unsigned (at least in openjpeg2), so
the calculation could silently wrap around without the explicit cast to
int.

Signed-off-by: Andreas Cadhalpun <andreas.cadhal...@googlemail.com>
---
 libavcodec/libopenjpegenc.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/libavcodec/libopenjpegenc.c b/libavcodec/libopenjpegenc.c
index 857ee1a..83c965d 100644
--- a/libavcodec/libopenjpegenc.c
+++ b/libavcodec/libopenjpegenc.c
@@ -415,13 +415,13 @@ static int libopenjpeg_copy_packed8(AVCodecContext 
*avctx, const AVFrame *frame,
                 frame_index += numcomps;
             }
             for (; x < image->comps[compno].w; ++x) {
-                image_line[x] = image_line[x - 1];
+                image_line[x] = x > 0 ? image_line[x - 1] : 0;
             }
         }
         for (; y < image->comps[compno].h; ++y) {
             image_line = image->comps[compno].data + y * 
image->comps[compno].w;
             for (x = 0; x < image->comps[compno].w; ++x) {
-                image_line[x] = image_line[x - image->comps[compno].w];
+                image_line[x] = y > 0 ? image_line[x - 
(int)image->comps[compno].w] : 0;
             }
         }
     }
@@ -455,13 +455,13 @@ static int libopenjpeg_copy_packed12(AVCodecContext 
*avctx, const AVFrame *frame
                 frame_index += numcomps;
             }
             for (; x < image->comps[compno].w; ++x) {
-                image_line[x] = image_line[x - 1];
+                image_line[x] = x > 0 ? image_line[x - 1] : 0;
             }
         }
         for (; y < image->comps[compno].h; ++y) {
             image_line = image->comps[compno].data + y * 
image->comps[compno].w;
             for (x = 0; x < image->comps[compno].w; ++x) {
-                image_line[x] = image_line[x - image->comps[compno].w];
+                image_line[x] = y > 0 ? image_line[x - 
(int)image->comps[compno].w] : 0;
             }
         }
     }
@@ -495,13 +495,13 @@ static int libopenjpeg_copy_packed16(AVCodecContext 
*avctx, const AVFrame *frame
                 frame_index += numcomps;
             }
             for (; x < image->comps[compno].w; ++x) {
-                image_line[x] = image_line[x - 1];
+                image_line[x] = x > 0 ? image_line[x - 1] : 0;
             }
         }
         for (; y < image->comps[compno].h; ++y) {
             image_line = image->comps[compno].data + y * 
image->comps[compno].w;
             for (x = 0; x < image->comps[compno].w; ++x) {
-                image_line[x] = image_line[x - image->comps[compno].w];
+                image_line[x] = y > 0 ? image_line[x - 
(int)image->comps[compno].w] : 0;
             }
         }
     }
@@ -536,13 +536,13 @@ static int libopenjpeg_copy_unpacked8(AVCodecContext 
*avctx, const AVFrame *fram
             for (x = 0; x < width; ++x)
                 image_line[x] = frame->data[compno][frame_index++];
             for (; x < image->comps[compno].w; ++x) {
-                image_line[x] = image_line[x - 1];
+                image_line[x] = x > 0 ? image_line[x - 1] : 0;
             }
         }
         for (; y < image->comps[compno].h; ++y) {
             image_line = image->comps[compno].data + y * 
image->comps[compno].w;
             for (x = 0; x < image->comps[compno].w; ++x) {
-                image_line[x] = image_line[x - image->comps[compno].w];
+                image_line[x] = y > 0 ? image_line[x - 
(int)image->comps[compno].w] : 0;
             }
         }
     }
@@ -579,13 +579,13 @@ static int libopenjpeg_copy_unpacked16(AVCodecContext 
*avctx, const AVFrame *fra
             for (x = 0; x < width; ++x)
                 image_line[x] = frame_ptr[frame_index++];
             for (; x < image->comps[compno].w; ++x) {
-                image_line[x] = image_line[x - 1];
+                image_line[x] = x > 0 ? image_line[x - 1] : 0;
             }
         }
         for (; y < image->comps[compno].h; ++y) {
             image_line = image->comps[compno].data + y * 
image->comps[compno].w;
             for (x = 0; x < image->comps[compno].w; ++x) {
-                image_line[x] = image_line[x - image->comps[compno].w];
+                image_line[x] = y > 0 ? image_line[x - 
(int)image->comps[compno].w] : 0;
             }
         }
     }
-- 
2.9.3
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to