summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Alekhin <alexander.alekhin@intel.com>2018-07-02 12:51:49 +0300
committerAlexander Alekhin <alexander.alekhin@intel.com>2018-07-02 12:56:50 +0300
commit55574744671526a0754ca0ae1a4efa1004c5279d (patch)
tree6e4e378d80bac19f7c0bb89d0792d3fbfd7956ed
parent5a27f7c81f5c046d94889d4f9233de6436ff31c9 (diff)
downloadopencv-55574744671526a0754ca0ae1a4efa1004c5279d.tar.gz
opencv-55574744671526a0754ca0ae1a4efa1004c5279d.tar.bz2
opencv-55574744671526a0754ca0ae1a4efa1004c5279d.zip
imgcodecs(sunras): avoid buffer overrun
`src_pitch` may be large than data `step`
-rw-r--r--modules/imgcodecs/src/grfmt_sunras.cpp10
1 files changed, 5 insertions, 5 deletions
diff --git a/modules/imgcodecs/src/grfmt_sunras.cpp b/modules/imgcodecs/src/grfmt_sunras.cpp
index 6398db567f..b419b7795a 100644
--- a/modules/imgcodecs/src/grfmt_sunras.cpp
+++ b/modules/imgcodecs/src/grfmt_sunras.cpp
@@ -175,8 +175,6 @@ bool SunRasterDecoder::readData( Mat& img )
AutoBuffer<uchar> _src(src_pitch + 32);
uchar* src = _src;
- AutoBuffer<uchar> _bgr(m_width*3 + 32);
- uchar* bgr = _bgr;
if( !color && m_maptype == RMT_EQUAL_RGB )
CvtPaletteToGray( m_palette, gray_palette, 1 << m_bpp );
@@ -340,16 +338,18 @@ bad_decoding_end:
case 24:
for( y = 0; y < m_height; y++, data += step )
{
- m_strm.getBytes( color ? data : bgr, src_pitch );
+ m_strm.getBytes(src, src_pitch );
if( color )
{
if( m_type == RAS_FORMAT_RGB )
- icvCvt_RGB2BGR_8u_C3R( data, 0, data, 0, cvSize(m_width,1) );
+ icvCvt_RGB2BGR_8u_C3R(src, 0, data, 0, cvSize(m_width,1) );
+ else
+ memcpy(data, src, std::min(step, (size_t)src_pitch));
}
else
{
- icvCvt_BGR2Gray_8u_C3C1R( bgr, 0, data, 0, cvSize(m_width,1),
+ icvCvt_BGR2Gray_8u_C3C1R(src, 0, data, 0, cvSize(m_width,1),
m_type == RAS_FORMAT_RGB ? 2 : 0 );
}
}