exr: check if line offset table is complete only once per frame
authorPaul B Mahol <onemda@gmail.com>
Thu, 21 Feb 2013 12:30:40 +0000 (12:30 +0000)
committerPaul B Mahol <onemda@gmail.com>
Fri, 22 Feb 2013 18:59:54 +0000 (18:59 +0000)
Signed-off-by: Paul B Mahol <onemda@gmail.com>
libavcodec/exr.c

index 0440e93..ab94ca0 100644 (file)
@@ -245,6 +245,7 @@ static int decode_frame(AVCodecContext *avctx,
     unsigned int ymin   = ~0;
     unsigned int ymax   = ~0;
     unsigned int xdelta = ~0;
+    unsigned int ydelta = ~0;
 
     int out_line_size;
     int bxmin, axmax;
@@ -362,6 +363,7 @@ static int decode_frame(AVCodecContext *avctx,
             xmax = AV_RL32(buf + 8);
             ymax = AV_RL32(buf + 12);
             xdelta = (xmax-xmin) + 1;
+            ydelta = (ymax-ymin) + 1;
 
             buf += variable_buffer_data_size;
             continue;
@@ -517,10 +519,12 @@ static int decode_frame(AVCodecContext *avctx,
         ptr += stride;
     }
 
+    if (buf_end - buf < (ydelta + scan_lines_per_block - 1) / scan_lines_per_block * 8)
+        return AVERROR_INVALIDDATA;
+
     // Process the actual scan line blocks
     for (y = ymin; y <= ymax; y += scan_lines_per_block) {
         uint16_t *ptr_x;
-        if (buf_end - buf > 8) {
             const uint8_t *red_channel_buffer, *green_channel_buffer, *blue_channel_buffer, *alpha_channel_buffer = 0;
             const uint64_t line_offset = bytestream_get_le64(&buf);
             int32_t data_size, line;
@@ -622,7 +626,6 @@ static int decode_frame(AVCodecContext *avctx,
                     if (alpha_channel_buffer)
                         alpha_channel_buffer += scan_line_size;
                 }
-            }
         }
 
     // Zero out the end if ymax+1 is not h